Python BeautifulSoup查找含特殊字符字符串无返回结果问题
问题根源
你在HTML源码里写的£是HTML实体编码,BeautifulSoup完成HTML解析后,会自动把所有合法的HTML实体转成对应的Unicode字符——£会被直接解析为英镑符号£,最终DOM树的文本节点里根本不会保留£这段原始字符串,你用正则匹配£自然拿不到任何结果。
你把实体替换成普通字符串pound后能正常匹配,就是因为普通文本不会被解析器做转义处理,文本节点里保留了完整的pound字符,正则可以命中。
修复方案
核心思路是匹配解析后实际存在的字符,不要匹配源码里的原始实体串,有两种常用实现:
- 直接匹配实体对应的Unicode字符,这是最简洁的方案,代码如下:
import re from bs4 import BeautifulSoup soup = BeautifulSoup("<html><body>BLAR fff11 £ </body></html>", 'html.parser') # 直接匹配转义后的英镑符号£ for z in soup.find_all(text=re.compile('£')): print(z)
运行代码可正常输出:BLAR fff11 £
- 批量匹配场景下可以借助标准库自动转义匹配规则,不用手动输入特殊字符:
import re import html from bs4 import BeautifulSoup # 自动将实体字符串转成对应Unicode字符,转换后match_str值为£ match_str = html.unescape('£') soup = BeautifulSoup("<html><body>BLAR fff11 £ </body></html>", 'html.parser') for z in soup.find_all(text=re.compile(match_str)): print(z)
注意:不管使用Python内置的
html.parser,还是lxml、html5lib等第三方解析器,BeautifulSoup都会默认将合法HTML实体转换为对应Unicode字符,不要直接在解析后的文本节点中查找原始实体编码字符串。
内容的提问来源于stack exchange,提问作者Ed Jones
相关产品推荐
相关产品推荐

