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

简介: 一日一技: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")],运行效果如下图所示:


1.png


但如果我们想忽略大小写的时候怎么办呢?实际上,在 XPath 2.0的标准里面,有一个关键字叫做lower-case就可以实现这个需求,XPath 写为: //div[lower-

case(@class)="footer"]/text()。我们可以在一些在线 XPath 检查的工具里面看到提取效果,如下图所示:


2.png


但坏就坏在,Python 的第三方库lxml使用的是 XPath 1.0标准,因此没有lower-case这个关键字。所以要实现这个需求,我们需要使用另一个关键字

translate//div[translate(@class, "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "abcdefghijklmnopqrstuvwxyz")="footer"]/text()


运行效果如下图所示:


3.png


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


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


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


运行效果如下图所示:


4.png



参考文献


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


请关注微信公众号【未闻Code】获取更多精彩文章。


目录
相关文章
|
存储 编译器 C语言
深度:用10000字总结了嵌入式C语言必学知识点
深度:用10000字总结了嵌入式C语言必学知识点
435 1
|
存储 安全 Java
Java.security包中的KeyStore类详解
Java.security包中的KeyStore类详解
730 0
|
10月前
|
存储 Ubuntu 数据安全/隐私保护
|
10月前
|
负载均衡 算法 Java
深入探索微服务架构下的服务治理
深入探索微服务架构下的服务治理
|
10月前
|
供应链 安全 网络安全
区块链技术与网络安全:机遇与挑战
区块链技术与网络安全:机遇与挑战
394 2
|
算法 搜索推荐 C++
【C++】sort()、stable_sort()和partial_sort()排序函数详解
【C++】sort()、stable_sort()和partial_sort()排序函数详解
616 0
|
10月前
|
安全 开发者 流计算
python中的deque详解
`deque`是Python中功能强大且灵活的双端队列,提供了高效的双端操作,适用于多种实际应用场景。通过详细了解 `deque`的基本特性和常见操作,开发者可以更好地利用这一数据结构来提高代码的性能和可读性。希望本文对你在Python编程中使用 `deque`有所帮助。
614 0
|
安全 Linux 网络安全
【工具使用】几款优秀的SSH连接客户端软件工具推荐FinalShell、Xshell、MobaXterm、OpenSSH、PUTTY、Terminus、mRemoteNG、Terminals等
【工具使用】几款优秀的SSH连接客户端软件工具推荐FinalShell、Xshell、MobaXterm、OpenSSH、PUTTY、Terminus、mRemoteNG、Terminals等
117031 0
|
设计模式 Java 程序员
拜托!别再滥用 != null 判空了!!——优化你的代码,提升开发效率
【8月更文挑战第20天】在软件开发的世界里,null 值的存在如同一把双刃剑,既提供了灵活性,也带来了复杂性。而!= null 的判空操作,几乎成了每个程序员日常编码中的“标配”。然而,过度依赖这种简单直接的判空方式,往往会导致代码可读性下降、逻辑冗余、甚至引入难以察觉的bug。今天,我们就来探讨一下如何优雅地减少或避免滥用!= null判空,从而提升代码质量和开发效率。
359 3
|
网络协议 Linux 网络安全
NMAP扫描基本操作
NMAP扫描基本操作
619 5