什么是XPath
XPath为XML路径语言,可以用于定位XML文本的节点,但实际上也适用于定位HTML中的节点。
在HTML中,节点就是一个个HTML标签。分析节点间的关系也就是要清除HTML文档中农各个标签的关系。
XPath路径表达式
使用路径表达式来选取XML或HTML的节点或节点集
路径表达式 | 描述 |
---|---|
/div | 从根节点开始选取div节点 |
//a | 选取文档中所有a节点,不考虑其位置 |
@class | 选取名为class的属性 |
. | 选取当前节点 |
… | 选取父节点 |
/div/p | 从根节点开始选取div节点下的p节点 |
/div/p[2]/ul | 从根节点开始选取div节点下的的二个p节点下的ul节点 |
//div[@class=‘text’ | 选取所有class属性名为text的div节点 |
//* | 选取文档中所有元素 |
//@* | 选取文档中所有带属性的元素 |
XPath函数
函数 | 描述 |
---|---|
/div/p/text() | 选取p节点的文本内容 |
//div[contains(@class, “post”)] | 选取带有class属性且宝行post的所有div节点 |
/div/p[last()-1] | 选取div下倒数第二个p节点 |
/div/|div/p | 选取div下的a节点 和 div下的p节点 |
Python lxml模块
lxml 是一种使用Python编写的库,可以迅速灵活地处理XML,lxml支持XPath。
安装lxml库
在cmd命令行中输入指令pip install lxml
,安装lxml库。
实操例子
from lxml import etree
html_data = '''
<div>
<ul>
<li class="item-1"><a href="1.html"> item 1</a></li>
<li class="item-2"><a href="2.html"> item 2</a></li>
<li class="item-3"><a href="3.html"><span class="bold"> item 1</span></a></li>
<li class="item-2"><a href="4.html"> item 4</a></li>
<li class="item-1"><a href="5.html"> item 5</a></li>
</ul>
</div>
'''
html = etree.HTML(html_data)
# print(etree.tostring(html).decode())
# 返回的是列表
# 获取所有li标签下所有a标签的文本内容
result = html.xpath("//li/a/text()")
print(result)
# [' item 1', ' item 2', ' item 4', ' item 5']
# 获取li标签下面所有的class属性
result = html.xpath("//li/@class")
print(result)
# ['item-1', 'item-2', 'item-3', 'item-2', 'item-1']
# 获取li标签 href值为1.html 的a标签的文本内容
result = html.xpath("//li/a[@href='1.html']/text()")
print(result)
# [' item 1']