1、xpath介绍
XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历。XPath 是 W3C XSLT 标准的主要元素,并且 XQuery 和 XPointer 都构建于 XPath 表达之上。
在爬虫中主要用于对html进行解析
2、路径表达式
表达式 | 描述 |
---|---|
nodename | 选取此节点的所有子节点。 |
/ | 从根节点选取。 |
// | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。 |
. | 选取当前节点。 |
.. | 选取当前节点的父节点。 |
@ | 选取属性 |
3、匹配属性
通配符 | 描述 |
---|---|
* | 匹配任何元素节点。 |
@* | 匹配任何属性节点。 |
node() | 匹配任何类型的节点。 |
4、安装
pip install lxml
5、使用流程
1. from lxml import etree
2. parseHtml = etree.HTML(html)
3. rList = parseHtml.xpath('表达式')
6、xpath匹配规则
1. 获取节点对象
//div[@class="test"]
2. 获取节点属性值
//div[@class="test"]//a/@src
3. 函数
//div[contains(@class,"test")]/a/@href
4.获取节点对象内容
//div/a/text()
7、属性多值匹配
某些节点的某个属性可能有多个值
from lxml import etree
text = '''
<li class="zxc asd wer"><a href="https://s2.bdstatic.com/">1 item</a></li>
<li class="ddd asd eee"><a href="https://s3.bdstatic.com/">2 item</a></li>
'''
html = etree.HTML(text)
result = html.xpath('//li[contains(@class, "asd")]/a/text()')
print(result)
# 运行结果:['1 item', '2 item']
8、多属性匹配
当前节点有多个属性时,需要同时进行匹配
from lxml import etree
text = '''
<li class="zxc asd wer" name="222"><a href="https://s2.bdstatic.com/">1 item</a></li>
<li class="ddd zxc eee" name="111"><a href="https://s3.bdstatic.com/">2 item</a></li>
'''
html = etree.HTML(text)
result = html.xpath('//li[contains(@class, "zxc") and @name="111"]/a/text()')
print(result)
# 运行结果:['2 item']
9、函数
- 查找最后一个li标签里的a标签的href属性(last()函数)
html = etree.HTML(text)
html_data = html.xpath('//li[last()]/a/text()')
print(html_data)
- 查找倒数第二个li标签里的a标签的href属性
html_data = html.xpath('//li[last()-1]/a/text()')
print(html_data)
打印
['item 4 ']
from lxml import etree
print("------------")
text = '''
<div>
<ul>
<li class="item-0"><a href="https://s1.bdstatic.com/">item 0 </a></li>
<li class="item-1"><a href="https://s2.bdstatic.com/">item 1 </a></li>
<li class="item-2"><a href="https://s3.bdstatic.com/">item 2 </a></li>
<li class="item-3"><a href="https://s4.bdstatic.com/">item 3 </a></li>
<li class="item-4"><a href="https://s5.bdstatic.com/">item 4 </a></li>
<li class="item-5"><a href="https://s6.bdstatic.com/">item 5 </a></li>
</ul>
</div>
'''
html = etree.HTML(text)
# 获取第一个
result = html.xpath('//li[1]/a/text()')
print(result)
# 获取最后一个
result = html.xpath('//li[last()]/a/text()')
print(result)
# 获取前两个
result = html.xpath('//li[position()<3]/a/text()')
print(result)
# 获取倒数第三个
result = html.xpath('//li[last()-2]/a/text()')
print(result)
"""
运行结果:
['item 0 ']
['item 5 ']
['item 0 ', 'item 1 ']
['item 3 ']
"""
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现