XPath 网页解析利器

6 阅读3分钟

XPath 基础操作:网页解析的得力工具

在网页数据提取和解析的过程中,XPath 凭借其强大的定位能力,成为开发者不可或缺的工具。本文将结合 Python 的lxml库,详细介绍 XPath 的基本概念、操作流程和常用表达式。

XPath 是什么?

XPath 是一门在 XML 或 HTML 文档中查找信息的语言,可用来在 XML 或 HTML 文档中对元素和属性进行遍历。HTML 文档本质上是一种树形结构,以html标签为根节点,层层嵌套其他标签,如下:

     html
    /         \
   head        body
  /     \       /    \
meta title     div    img

在这样的结构中,XPath 能够帮助我们精准定位到目标元素。

XPath 工作流程

Step1:解析文档

使用lxml库将 XML 或 HTML 文档解析成树形结构。lxml是 Python 中功能强大的处理 XML 和 HTML 的库,安装后可通过以下代码导入:

from lxml import etree

解析本地文件示例:

try:
    fp = open('xpath.html', "r", encoding="utf-8")
    tree = etree.parse(fp)
except FileNotFoundError:
    print("文件找不到")

Step2:定义 XPath 表达式

XPath 表达式是用于定位目标节点的关键。比如选取所有的p标签,表达式为//p;选取第一个div元素,表达式为//div[0] 。

Step3:执行查询

通过tree.xpath()方法执行 XPath 表达式,获取目标节点。如:

title_tag = tree.xpath('/html/head/title/text()')

Step4:提取信息

获取目标节点后,可提取节点的文本或属性值。如上述代码中title_tag获取的就是标签内的文本。

XPath 表达式示例

  • 选取所有的 p 标签://p
  • 选取第一个 div 元素://div[0]
  • 选取所有带 class a 标签://a[@class]
  • 选取 id=example div 标签://a[@id='example']
  • 选取 div 内所有的 p 标签:/div//p

单斜杠和双斜杠的区别

  • 最左侧是单斜杠:表示从根标签开始定位,如/html/head/title。
  • 最左侧是双斜杠:表示从任意位置定位标签,如//p。
  • 非最左侧的单斜杠:表示一个层级,如div/p表示div标签下直接子级的p标签。
  • 非最左侧的多个双斜杠:表示多个层级,如div//p表示div标签下任意层级的p标签。

实战代码

下面是一个完整的示例代码:

from lxml import etree
try:
    fp = open('xpath.html', "r", encoding="utf-8")
    tree = etree.parse(fp)
    title_tag = tree.xpath('/html/head/title/text()')
    print("标题:", title_tag)
    img_urls = tree.xpath("//div[@class='tang']/ul//a/@href")
    for img in img_urls:
        print(img)
except FileNotFoundError:
    print("文件找不到")
except Exception as e:
    print(f"发生错误{e}")

上述代码实现了从 HTML 文件中提取网页标题和特定div下链接的功能。

XPath 在网页解析和数据提取中发挥着重要作用,掌握其基本操作,能够帮助开发者更高效地获取所需数据。希望本文能为大家在 XPath 学习和应用中提供帮助。

示例中的html片段

<html lang="en">
<head>
    <meta charset="UTF-8"/>
    <title>测试bs4</title>
</head>
<body>
<div>
    <p>百里守约</p>
</div>
<div class="song">
    <p>李清照</p>
    <p>王安石</p>
    <p>苏轼</p>
    <p>柳宗元</p>
    <a href="http://www.song.com/" title="赵匡胤" target="_self">
        <span>this is span</span>
        宋朝是最强大的王朝,不是军队的强大,而是经济很强大,国民都很有钱</a>
    <a href="" class="du">总为浮云能蔽日,长安不见使人愁</a>
    <img src="http://www.baidu.com/meinv.jpg" alt=""/>
</div>
<div class="tang">
    <ul>
        <li><a href="http://www.baidu.com" title="qing">清明时节雨纷纷,路上行人欲断魂,借问酒家何处有,牧童遥指杏花村</a>
        </li>
        <li><a href="http://www.163.com" title="qin">秦时明月汉时关,万里长征人未还,但使龙城飞将在,不教胡马度阴山</a>
        </li>
        <li><a href="http://www.126.com" alt="qi">岐王宅里寻常见,崔九堂前几度闻,正是江南好风景,落花时节又逢君</a></li>
        <li><a href="http://www.sina.com" class="du">杜甫</a></li>
        <li><a href="http://www.dudu.com" class="du">杜牧</a></li>
        <li><b>杜小月</b></li>
        <li><i>度蜜月</i></li>
        <li><a href="http://www.haha.com" id="feng">凤凰台上凤凰游,凤去台空江自流,吴宫花草埋幽径,晋代衣冠成古丘</a></li>
    </ul>
</div>
</body>
</html>