一、基本介绍
xpath全称XML Path Language,即XML路径语言,用于定位XML文档中某个部分位置的语言
1.主要用途
定位节点:通过节点名称、节点路径、节点属性等方式定位
选择节点:根据节点的属性、节点的文本内容、节点的位置等条件选择
提取数据:通过定位和选择节点,从XML文档中提取所需要的数据,并进一步分析
二、xpath语法-基础语法
1.常用路径表达式
表达式 | 说明 |
/ | 如果写在最前面则从根节点选取,否则是当前节点下的子节点 |
// | 可以获得所有标签节点 |
. | 当前节点 |
.. | 当前节点的父节点 |
text() | 一个开闭标签的文本内容 |
@ | 某个标签节点的属性 |
举例说明
- /title:根节点下的所有title标签
- //div:根节点下的所有div标签
- ./div[@class="text"].text():当前节点下,属性class="text"的所有div的文本内容
三、xpath语法-谓语
表达式举例
表达式 | 结果 |
//bookstore/book[1] | 选取属于 bookstore 子元素的第一个book 元素 |
//bookstore/book[last()] | 选取属于 bookstore子元素的最后一个 book 元素 |
//bookstore/book[last()-1] | 选取属于 bookstore 子元素的倒数第二个 book 元素 |
//bookstore/book[position()>1] | 选择所有 bookstore 下面的 book元素,从第二个开始选择 |
//div[contains(@i,“test_div_”)] | 找到所有 div节点,且id包含了"test_div_" |
//div[@class=“pagination”]//span[contains(text(),“下一页”)] | 先找到class="pagination"的 div,再找其子节点span,且文本内容包下一页 |
四、选取多个路径
通过 xpath 的运算符|
,选取多个路径,表示多个路径的并集
路径举例
路径表达式 | 说明 |
//book/title | //book/price | 选取 book元素下的所有title和 price元素 |
//title | //price | 选取文档中的所有title和 price元素 |
/bookstore/book/title | //price | 选取属于 bookstore节点下 book 节点下的所有 title节点 以及文档中所有的 price 元素 |
五、什么是Python lxml?
lxml是一个用于处理XML和HTML文档的Python库。lxml提供了一种简单而高效的方式来解析、构建、修改和查询XML和HTML文档。无论是在Web开发、数据抓取、数据清洗还是数据处理方面,lxml都是一个非常有用的工具。
- 安装lxml
要开始使用lxml,首先需要安装它,可以使用pip来安装lxml:
pip install lxml
安装完成后,可以开始在Python项目中使用lxml。
- 基本用法
解析XML和HTML文档:
lxml可以解析XML和HTML文档,将它们转换为Python中的元素树,以便进一步处理。
- 利用Xpath定位元素
这里我们以解析HTML文档举例,lxml支持XPath查询,可以根据条件选择元素。
from lxml import etree
#这里是以一个HTML文档
html_data = '''
<div>
<ul>
<li class="item-0"><a href="link1.html">first item</a></li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-inactive"><a href="link3.html"><span class="bold">third item</span></a></li>
<li class="item-1"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a>
</ul>
</div>
'''
html=etree.HTML(html_data)
# 使用//返回一个列表,每一个元素都是Element类型
result=html.xpath('//li/a/text()')
# /@获得元素的属性值
result=html.xpath('//li/@class')
# 根据属性值获取元素内容
result=html.xpath('//li/a[@href="link1.html"]/text()')
# 返回所有li标签中的所有span标签中的文本
result=html.xpath('//li//span/text()')
# 返回所有li标签中的最后一元素中的a标签属性值
result=html.xpath('//li[last()]/a/@href')