一日一技: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】获取更多精彩文章。


目录
相关文章
|
存储 Java 测试技术
JAVA-MAVEN初学者教程(配置、pom.xml、依赖管理等)
JAVA-MAVEN初学者教程(配置、pom.xml、依赖管理等)
3800 0
|
XML JSON Ubuntu
Python实用记录(十五):PyQt/PySide6打包成exe,精简版(nuitka/pyinstaller/auto-py-to-exe)
本文介绍了使用Nuitka、PyInstaller和auto-py-to-exe三种工具将Python的PyQt/PySide6应用打包成exe文件的方法。提供了详细的安装步骤、打包命令和参数说明,适合新手学习和实践。
7898 0
|
存储 JSON 自然语言处理
数据标注工具 doccano | 命名实体识别(Named Entity Recognition,简称NER)
标注数据保存在同一个文本文件中,每条样例占一行且存储为json格式,其包含以下字段 • id: 样本在数据集中的唯一标识ID。 • text: 原始文本数据。 • entities: 数据中包含的Span标签,每个Span标签包含四个字段: • id: Span在数据集中的唯一标识ID。 • start_offset: Span的起始token在文本中的下标。 • end_offset: Span的结束token在文本中下标的下一个位置。 • label: Span类型。 • relations: 数据中包含的Relation标签,每个Relation标签包含四个字段: • id: (Span
1149 0
|
存储 开发框架 安全
ASP.NET WebApi 如何使用 OAuth2.0 认证
ASP.NET WebApi 如何使用 OAuth2.0 认证
521 1
|
NoSQL Java 中间件
springboot整合常用中间件框架案例
该项目是Spring Boot集成整合案例,涵盖多种中间件的使用示例,每个案例项目使用最小依赖,便于直接应用到自己的项目中。包括MyBatis、Redis、MongoDB、MQ、ES等的整合示例。
663 1
|
缓存 前端开发 API
探索PWA(Progressive Web Apps)的无限可能
探索PWA(Progressive Web Apps)的无限可能
1089 8
|
编译器 C语言 C++
C/C++数字与字符串互相转换
C/C++数字与字符串互相转换
|
Linux Python
Python获得本机本地ip地址的方法
【10月更文挑战第8天】 socket模块包含了丰富的函数和方法,可以获取主机的ip地址,例如gethostbyname方法可以根据主机名获取ip地址,gethostbyname_ex方法可以获得本机所有ip地址列表,也可以使用netifaces模块获取网卡信息。
594 0