python 奇奇怪怪的xpath

python 奇奇怪怪的xpath

0 背景

python 奇奇怪怪的xpath

之前的爬虫过程中, 一些简单的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

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!