使用正则提取爬取的路透文章内容时BODY标签匹配失败是什么原因
匹配失败的核心原因
- 捕获组仅支持单字符匹配:你写的
(.)没有加任何量词,仅能捕获标签后的单个字符,完全无法覆盖多字符、多行的body内容。 .默认不匹配换行符:Pythonre模块默认模式下,.元字符不会识别\n换行符,而你的body内容存在多段换行,即使给.加了量词默认也匹配不到截止到</BODY>的完整内容。- 标签转义不匹配:如果你的原始文本没有经过HTML实体解码,尖括号会被转义为
<和>,此时用<BODY>作为匹配规则无法命中转义后的标签内容。 - 贪婪匹配溢出(可选优化项):如果使用
.*做贪婪匹配,当文本中存在多个</BODY>标签时会匹配到最后一个标签的位置,超出预期范围。
修复方案
第一步(可选,推荐):先对原始文本做HTML实体解码,把<、>这类实体转回普通的尖括号:
import html example_txt = html.unescape(example_txt)
第二步:调整正则规则,增加匹配换行的修饰符,使用非贪婪匹配:
import re try: # re.S 等价于 re.DOTALL,作用是让 . 可以匹配换行符,.*? 是非贪婪匹配,到第一个</BODY>就停止 body = re.search(r'<BODY>(.*?)</BODY>', example_txt, flags=re.S).group(1).strip() except: body = 'NA'
如果不想做实体解码,可以直接把正则里的标签替换为转义后的格式:
body = re.search(r'<BODY>(.*?)</BODY>', example_txt, flags=re.S).group(1).strip()
内容的提问来源于stack exchange,提问作者realkes
相关产品推荐
相关产品推荐

