python 奇奇怪怪的xpath
0 背景
之前的爬虫过程中, 一些简单的xpath语法就可以帮助我们定位到html/xml的元素和内容, 但有时, 一些元素需要通过一些不常用的方式去做定位. 比如有些元素没有id
, class
, 光秃秃的啥属性都没有. 这就很难定位了, 所以有时, 需要其他的定位方式.
所以, 我就想记录一些不常用的xpath定位方法, 当然, 也不能说不常用, 只是一般用的少.
1 记录
示例
<ul>
<li><a href="/page/1" class="prev_page">Prev</a></li>
<li><a href="/page/1" page="1"></a></li>
<li><a href="/page/2" class="active" page="2"></a></li>
<li><a href="/page/100" page="100"></a></li>
<li><a href="/page/3" class="next_page">Next</a></li>
</ul>
获取单一节点node下的所有内容(包含子孙节点的内容)
# 获取节点的所有内容
node = html.xpath('string(//ul)')
在xpath中使用string()
的好处是, 不论有没有结果, 都会返回字符串, 找不到的时候就会返回空字符串, 至少不会报错了. 因为有时候经常会遇到html.xpath()[0]
通过数组的下标取值, 如果这个元素不存在, 就会报索引异常, 直接阻断我们程序的正常执行, 所以有时候我会喜欢用string()
去直接获取数据.
和text()
函数不同的是, text()
只会获取ul
节点下的文本, string()
会获取节点本身以及子孙节点下的所有内容.
获取是数字属性的节点
nodes = html.xpath('//a[number(@page)]/@page')
获取最后一页(通过Next节点的上一个兄弟节点定位)
获取最后一页 (通过Next节点的上一个兄弟节点定位)
node = html.xpath('string(//a[@class="next_page"]/../preceding-sibling::li[1]/a/@page)')
前面的兄弟节点是preceding-sibling
, 后面的兄弟节点是following-sibling
.
直接获取倒数第二个a
标签
node = html.xpath('string((//a[@page])[last()-1]/@page)')
获取单一节点node本身 & 和node后面所有的节点
nodes = html.xpath('//li/a[@class="active"]/..')[0].xpath('. | ./following-sibling::*')
获取开头是xxx
的节点
node = html.xpath('//a[starts-with(@page,"1")]/@page')
注意, python的lxml的xpath使用的是1.1版本的xpath语法, 只有starts-with
的方法, 没有ends-with
的方法, 在高版本的xpath中存在ends-with
这个语法, 如果不那么严谨, 我们可以使用contains()
语法, 再拿到python中进行判断, 或者使用
删除节点
有时候需要删除一些节点.
nodes = html.xpath('//a[@page]')
for node in nodes:
node.getparent().remove(node)
转成html文本
etree.tostring(html, pretty_print=True).decode()
子节点中包含a的节点
nodes = html.xpath('//li[a]')
子孙节点中包含a的节点
nodes = html.xpath('//li[descendant::a]')
2 关于
欢迎关注我的微信公众号
原文始发于微信公众号(其之):python 奇奇怪怪的xpath
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/204844.html