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


目录
相关文章
|
Python
解决安装ConcurrentLogHandler报错error in ConcurrentLogHandler setup command: use_2to3 is invalid.
本文介绍了在Python环境下安装ConcurrentLogHandler时遇到的"use_2to3 is invalid"错误的解决方法,主要是通过降级setuptools到57.5.0版本来解决该问题。
1067 2
|
7月前
|
存储 人工智能 算法
显卡不再是刚需?微软开源“省钱”神技:让100B大模型在普通CPU上跑疯了!
微软BitNet以1.58-bit三值量化技术,将百亿参数大模型压缩至CPU可运行级别:内存降10倍、运算转整数加减,Mac/ThinkPad即可实现5–7 tokens/s推理,功耗降低超70%。开源框架bitnet.cpp让本地私有AI真正普惠。(239字)
1283 1
|
Web App开发 人工智能 自然语言处理
利用Playwright MCP与LLM构建复杂的工作流与AI智能体
本文介绍如何通过Playwright MCP与大语言模型(LLM)结合,构建智能AI代理与自动化工作流。Playwright MCP基于Model Context Protocol,打通LLM与浏览器自动化的能力,实现自然语言驱动的网页操作。涵盖环境配置、核心组件、智能任务规划、自适应执行及电商采集、自动化测试等实战应用,助力高效构建鲁棒性强、可扩展的AI自动化系统。
|
Java 应用服务中间件 Maven
IDEA创建一个Servlet项目(tomcat10)
IDEA创建一个Servlet项目(tomcat10)
1359 1
|
存储 开发框架 安全
ASP.NET WebApi 如何使用 OAuth2.0 认证
ASP.NET WebApi 如何使用 OAuth2.0 认证
617 1
|
Python
matplotlib绘制雷达图之基本配置——万能模板案例
matplotlib绘制雷达图之基本配置——万能模板案例
2232 0
matplotlib绘制雷达图之基本配置——万能模板案例
|
NoSQL Java 中间件
springboot整合常用中间件框架案例
该项目是Spring Boot集成整合案例,涵盖多种中间件的使用示例,每个案例项目使用最小依赖,便于直接应用到自己的项目中。包括MyBatis、Redis、MongoDB、MQ、ES等的整合示例。
785 1
Java 异常处理下篇:11 个异常处理最佳实践
本文深入探讨了 Java 异常处理的最佳实践,包括早抛出晚捕获、只捕获可处理的异常、不要忽略捕获的异常、抛出具体检查性异常、正确包装自定义异常、记录或抛出异常但不同时执行、避免在 `finally` 块中抛出异常、避免使用异常进行流程控制、使用模板方法处理重复的 `try-catch`、尽量只抛出与方法相关的异常以及异常处理后清理资源。通过遵循这些实践,可以提高代码的健壮性和可维护性。
550 4
|
编译器 C语言 C++
C/C++数字与字符串互相转换
C/C++数字与字符串互相转换
|
数据采集 Java Python
Python并发编程:多线程(threading模块)
本文详细介绍了Python的threading模块,包括线程的创建、线程同步、线程池的使用,并通过多个示例展示了如何在实际项目中应用这些技术。通过学习这些内容,您应该能够熟练掌握Python中的多线程编程,提高编写并发程序的能力。 多线程编程可以显著提高程序的并发性能,但也带来了新的挑战和问题。在使用多线程时,需要注意避免死锁、限制共享资源的访问,并尽量使用线程池来管理和控制线程。

热门文章

最新文章