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>