Xpath:基本应用的记录和轴相关的高级应用
Python爬虫开发中,xpath速度是比较快的使用较为灵活,是在网页定位元素的较优选择。
虽然文本解析库中正则表达式的性能比Xpath要强,但是企业级爬虫开发里,Xpath比正则要更为常见得多。
对于我的话,“不管是什么魔法、什么妖法,只有有用的都会用。”
而往网上的文章,对于Xpath语句的记录都比较零碎,所以在这里统一整理一下,自己可能常用的Xpath。
运行环境 Runtime environment
1 | 操作系统 : Windows10 |
准备
在python中安装Xpath,在终端输入完成安装。
通常来讲安装是不会出现问题,如果出现了请根据报错搜索解决。
高版本的lxml是没有etree方法的,所以网上的代码不一定有用多数因为这个原因。
pip install lxml
测试用的前端网页代码
1 |
|
Xpath 应用
匹配节点下全匹配 .//
- //获取文档中所有匹配的节点,
- .获取当前节点,有的时候我们需要获取当前节点下的所有节点,
- .//一定要结合.使用//,否则都会获取整个文档的匹配结果。
匹配包含某标签/属性的所有的属性值 //
- 如果使用了类似Xpath Helper之类的浏览器插件,善用全匹配,可以有效的缩短插件自动生成的Xpath
1
2
3
4print(tree.xpath('//@code')) #匹配所有带有code属性的属性值
print(tree.xpath('//li')) #匹配所有li标签
选取多个路径|
- 该符号目的是为了在一个xpath中写多个表达式,用|分开,每个表达式互不干扰。
- 符合匹配表达式的元素都会放到同一个列表里
1
print(tree.xpath('//div[@id="testid"]/h2/text() | //li[@data]/text()'))#多个匹配条件
position定位
- 该符号目的是为了在一个xpath中写多个表达式,用|分开,每个表达式互不干扰。
- 符合匹配表达式的元素都会放到同一个列表里
1
print(tree.xpath('//*[@id="testid"]/ol/li[position()=2]/text()')[0] )
Axes(轴)
对常用的Xpath轴先做简单的整合,再做分别测试。
1 | XPath 坐标轴:坐标轴用于定义当对当前节点的节点集合。 |
child:选取当前节点的所有子元素
1 | #child子节点定位 |
attribute:选取当前节点的所有属性
1 | print(tree.xpath('//div/attribute::id')) |
ancestor:父辈元素 / ancestor-or-self:父辈元素及当前元素
descendant:后代 / descendant-or-self:后代及当前节点本身
1 | print(tree.xpath('//div/attribute::id')) |
following :选取文档中当前节点的结束标签之后的所有节点
1 | print(tree.xpath('//div[@id="testid"]/following::div[not(@id)]/.//li[1]/text()')) |
namespace:选取当前节点的所有命名空间节点
1 | print(tree.xpath('//div[@id="testid"]/namespace::*')) |
parent:选取当前节点的父节点
1 | print(tree.xpath('//li[@data="one"]/parent::ol/li[last()]/text()')) |
preceding:选取文档中当前节点的开始标签之前的所有节点
1 | # 记住是标签开始之前,同级前节点及其子节点 |
preceding-sibling:选取当前节点之前的所有同级节点
1 | print(tree.xpath('//div[@id="testid"]/preceding-sibling::div/ul/li[2]/text()')[0]) |
self:选取当前节点
1 | # 选取带id属性值的div中包含data属性的标签的所有属性值 |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 快乐咸鱼のRaXianch窝!
评论
WalineValine