Python爬虫:XPath基本语法

XPath(XML Path Language)是一种用于在XML文档中定位元素的语言。它使用路径表达式来选择节点或节点集,类似于文件系统中的路径表达式。

不啰嗦,讲究使用,直接上案例。

导入

复制代码
pip3 install lxml

from lxml import etree

案例样本

复制代码
xml = '''
  <html lang="zh">
    <head>
      <meta charset="UTF-8">
      <title>示例网页</title>
    </head>
    <body>
      <h1>欢迎来到我的网站</h1>
      <p>这是一个简单的HTML页面,用于演示XPath解析。</p>
      <ul>
        <li><a href="https://www.example.com/page1">链接1</a></li>
        <li><a href="https://www.example.com/page2">链接2</a></li>
        <li><a href="https://www.example.com/page3">链接3</a></li>
      </ul>
      <div id="content">
        <h2>内容标题</h2>
        <p>这是一段内容。</p>
        <p>这是另一段内容。</p>
      </div>
    </body>
	</html>
'''
扫一扫欢迎关注,一起学习!

基本语法

|---------|-------------------------------------|
| 表达式 | 描述 |
| / | 从根节点选取 |
| // | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置(取子孙节点) |
| . | 选取当前节点 |
| .. | 选取当前节点的父节点 |
| @ | 选取属性 |

复制代码
tree = etree.HTML(html)

## 从根节点选取
data1 = tree.xpath('/html')
print('从根节点选取:',data1)

## 取head下title的值
data2 = tree.xpath('/html/head/title/text()')
print('取head下title的值:',data2)

## 取子孙节点值
data3 = tree.xpath('//p/text()')
print('取子孙节点值为:',data3)

## 选取当前节点值
all_p = tree.xpath('//p')
for p in all_p:
    print('选取当前节点:',p.xpath('.')) # 获取值话:./text()
    print('选取当前节点父节点:',p.xpath('..'))

## 获取html,lang属性
attr = tree.xpath('/html/@lang')
print('获取html,lang属性:',attr)

## 获取所有href的属性
href = tree.xpath('//@href')
print('获取所有href的属性:',href)

从根节点选取: [<Element html at 0x105346cc0>]

取head下title的值: ['示例网页']

取子孙节点值为: ['这是一个简单的HTML页面,用于演示XPath解析。', '这是一段内容。', '这是另一段内容。']

选取当前节点: [<Element p at 0x1055d1f40>]

选取当前节点父节点: [<Element body at 0x1055d90c0>]

选取当前节点: [<Element p at 0x1055d9040>]

选取当前节点父节点: [<Element div at 0x1055d90c0>]

选取当前节点: [<Element p at 0x1055d9080>]

选取当前节点父节点: [<Element div at 0x1055d90c0>]

获取html,lang属性: ['zh']

获取所有href的属性: ['https://www.example.com/page1', 'https://www.example.com/page2', 'https://www.example.com/page3']

条件选择基本语法

1. 选取属于ul子元素的第一个li元素的a 值,这里从 1 开始

复制代码
tree.xpath('/html/body/ul/li[1]/a/text()')

2. 选取属于ul子元素的最后一个li元素的a 值

复制代码
tree.xpath('/html/body/ul/li[last()]/a/text()')

3. 选取属于ul子元素的倒数第二个li元素的a 值

复制代码
tree.xpath('/html/body/ul/li[last()-1]/a/text()')

4. 选取所有拥有名为 href 的属性的 a 元素

复制代码
tree.xpath('//a[@href]')

5. 选取所有拥有名为 id=content 的属性的 div 元素

复制代码
tree.xpath('//div[@id="content"]')

6. 选取 ul 元素的所有 li 元素,且其中的 a 元素的值须为 链接2,如果是数值可以比大小运算

复制代码
tree.xpath('/html/body/ul/li[a="链接2"]')

选取属于ul子元素的第一个li元素a值: ['链接1']

选取属于ul子元素的最后一个li元素a值: ['链接3']

选取属于ul子元素的最后一个li元素a值: ['链接2']

选取所有拥有名为 href 的属性的 a 元素: [<Element a at 0x1026460c0>, <Element a at 0x102646140>, <Element a at 0x1026461c0>]

选取所有拥有名为 id=content 的属性的 div 元素: [<Element div at 0x102646240>]

选取 ul 元素的所有 li 元素,且其中的 a 元素的值须为 链接2: ['链接2']

通配符与运算选择基本语法

1. 选取 html 元素的所有子元素

复制代码
tree.xpath('/html/*')

2. 选取文档中的所有元素

复制代码
tree.xpath('//*')

3. 选取所有带有属性的 a 元素

复制代码
tree.xpath('//a[@*]')

4. 选取 body 元素的所有 h1 和 p 元素

复制代码
tree.xpath('//body/h1 | //body/p')

5. 选取文档中的所有 h1 和 p 元素

复制代码
tree.xpath('//h1 | //p')

选取 html 元素的所有子元素: [<Element head at 0x1054de480>, <Element body at 0x1054de100>]

选取文档中的所有元素: [<Element html at 0x10518ee40>, <Element head at 0x1054de040>, <Element meta at 0x1054de440>, <Element title at 0x1054de180>, <Element body at 0x1054de4c0>, <Element h1 at 0x1054de540>, <Element p at 0x1054de140>, <Element ul at 0x1054de580>, <Element li at 0x1054de5c0>, <Element a at 0x1054de300>, <Element li at 0x1054de500>, <Element a at 0x1054de380>, <Element li at 0x1054de600>, <Element a at 0x1054de400>, <Element div at 0x1054de640>, <Element h2 at 0x1054de680>, <Element p at 0x1054de200>, <Element p at 0x1054de240>]

选取所有带有属性的 a 元素: [<Element a at 0x1054de300>, <Element a at 0x1054de380>, <Element a at 0x1054de400>]

选取 body 元素的所有 h1 和 p 元素: [<Element h1 at 0x1054de4c0>, <Element p at 0x1054de140>]

选取文档中的所有 h1 和 p 元素: [<Element h1 at 0x1054de440>, <Element p at 0x1054de140>, <Element p at 0x1054de200>, <Element p at 0x1054de240>]
相关推荐
紫小米1 小时前
后端日志管理
python·fastapi
白雪茫茫2 小时前
监督学习、半监督学习、无监督学习算法详解
python·学习·算法·ai
つ安静与叛逆的小籹人2 小时前
小红书API:通过笔记ID获取笔记详情数据教程
笔记·python
05候补工程师2 小时前
[实战复盘] 拒绝 AI 屎山!我从设计模式中学到的“调教”AI 新范式
人工智能·python·设计模式·ai·ai编程
阿豪只会阿巴4 小时前
【没事学点啥】TurboBlog轻量级个人博客项目——项目介绍
javascript·python·django·html
qq_413502026 小时前
如何创建CDB公共用户_C##前缀强制规则与CONTAINER=ALL
jvm·数据库·python
yexuhgu6 小时前
CSS如何利用-checked实现纯CSS手风琴折叠_通过状态选择器控制区域高度
jvm·数据库·python
AC赳赳老秦6 小时前
接口测试自动化:用 OpenClaw 对接 Postman,实现批量回归测试、测试报告自动生成与推送
java·人工智能·python·算法·elasticsearch·deepseek·openclaw
PILIPALAPENG6 小时前
第4周 Day 1:智能体记忆系统——给 Agent 一个"大脑"
前端·人工智能·python
DavidTaozhe6 小时前
一文搞懂外汇接口怎么实时更新美元汇率
大数据·python