一日一技:XPath 匹配如何忽略大小写?

举报
未闻Code 发表于 2022/01/25 10:55:56 2022/01/25
【摘要】 忽略大小写的XPath 匹配

GNE[1]在对新闻进行预处理的时候,会提前移除一些显然不可能包含正文的 Dom 节点,从而增加提取的准确性。

一般来说,网页的版权信息,页尾信息,会放在一个叫做<div class="footer"></div>的标签里面。所以,要用 XPath 找到这种版权信息,本来应该非常简单://div[@class="footer"]。但实际场景中,可能有两种情况:<div class="xxxfooteryyy"></div><div class="Footer">

footer前后都有字符的时候,我们可以使用 XPath 的关键词contains//div[contains(@class, "footer")],运行效果如下图所示:

22.png

但如果我们想忽略大小写的时候怎么办呢?实际上,在 XPath 2.0的标准里面,有一个关键字叫做lower-case就可以实现这个需求,XPath 写为: //div[lower-case(@class)="footer"]/text()。我们可以在一些在线 XPath 检查的工具里面看到提取效果,如下图所示:

23.png

但坏就坏在,Python 的第三方库lxml使用的是 XPath 1.0标准,因此没有lower-case这个关键字。所以要实现这个需求,我们需要使用另一个关键字translate//div[translate(@class, "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "abcdefghijklmnopqrstuvwxyz")="footer"]/text()

运行效果如下图所示:

24.png

这里的translate效果就跟 Python 字符串的translate差不多。我以前写过一篇文章:一日一技:在字符串中批量替换单个字符介绍在 Python 里面怎么使用translate方法。

XPath 的translate的语法为:translate(目标属性, 需要替换的字符, 替换成字符)。这样就可以把节点的目标属性值转成小写再来对比。

那么,如果HTML 标签的属性值是xxxFooteryyy怎么办呢?其实我们也可以像函数嵌套一样再套一层contains//div[contains(translate(@class, "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "abcdefghijklmnopqrstuvwxyz"), "footer")]

运行效果如下图所示:

25.png

参考文献

[1]GNE: https://github.com/GeneralNewsExtractor/GeneralNewsExtractor

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。