当前位置: 首页 > news >正文

Python爬虫:XPath基本语法

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

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

导入

pip3 install lxmlfrom 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>]
http://www.lryc.cn/news/290785.html

相关文章:

  • UML/SysML建模工具更新情况(截至2024年1月)(1)UModel 2024
  • ubuntu20-github不通问题
  • 【MAC】Multi-Level Monte Carlo Actor-Critic阅读笔记
  • [GN] 设计模式—— 创建型模式
  • 链表——超详细
  • 【刷题】 leetcode 面试题 08.05.递归乘法
  • C语言实现希尔排序算法(附带源代码)
  • R语言【taxlist】——subset():取taxlist对象的子集
  • 单片机学习笔记---定时器计数器(含寄存器)工作原理介绍(详解篇2)
  • 《动手学深度学习(PyTorch版)》笔记4.1
  • OpenAI发布新模型!ChatGPT性能重磅提升,API大幅降价,GPT-4 「变懒」被修复
  • 【C深度解剖】计算机数据下载和删除原理
  • ASTORS国土安全奖:ManageEngine AD360荣获银奖
  • clang--cpplint--gitlint
  • Web开发8:前后端分离开发
  • 基于 java+springboot+mybatis电影售票网站管理系统前台+后台设计和实现
  • 【INTEL(ALTERA)】错误:*.onchip_flash_0:UFM 扇区不支持“隐藏”模式。请更新访问模式设置
  • 备战蓝桥杯---数据结构与STL应用(基础3)
  • 「优选算法刷题」:只出现一次的数字Ⅲ
  • Vue-43、Vue中组件自定义事件
  • GitHub 开启 2FA 双重身份验证的方法
  • ASP.NET Core 过滤器 使用依赖项注入
  • 2024年的网创之路应该这样走才对
  • ssh异常报错:Did not receive identification string from
  • MIDI码深度解析
  • 小红书如何做混部?
  • [PHP]严格类型
  • 作为程序员,你必须学会Maven
  • UDF学习(三)数据访问宏
  • Web3技术革新:重新定义在线体验