Python爬取维基百科时如何截断参考文献后的尾部冗余文本
解决方案
原有代码的核心问题
- 选择器写法错误:
soup.findAll('mw-content-text')是匹配标签名为mw-content-text的元素,实际上mw-content-text是正文容器的class属性值,原代码根本没有正确选中正文容器,直接调用soup.text会拿到整个页面的全量文本,包含所有页脚、侧边栏冗余内容。 - 截断逻辑错误:用正则或者字符串replace匹配文本截断很容易受页面内容变动影响,要么截断位置不准,要么误删正文内容。
正确实现思路
维基百科所有语言版本的参考文献板块都有固定的id锚点,直接操作DOM树,找到参考文献标题节点后,把该节点及其之后的所有同级节点全部删除,再提取剩余正文容器的文本,就能完整保留原有的标题层级、段落空白格式,不会出现内容混乱。
可直接运行的修正代码
import requests from bs4 import BeautifulSoup website = "https://nl.wikipedia.org/wiki/Kat_(dier)" request = requests.get(website) soup = BeautifulSoup(request.text, "html.parser") # 选中正文容器 content_box = soup.find(class_="mw-content-text") # 定位参考文献板块标题:荷兰语维基参考文献锚点id为Referenties # 中文维基替换为"参考文献",英文维基替换为"References"即可适配 ref_section = content_box.find(id="Referenties") if ref_section: # 先拿到参考文献标题的父节点(即完整的标题块) ref_heading = ref_section.parent next_node = ref_heading.find_next_sibling() # 循环删除参考文献标题之后的所有节点 while next_node: tmp = next_node.find_next_sibling() next_node.decompose() next_node = tmp # 最后删除参考文献标题块本身 ref_heading.decompose() # 直接提取处理后的容器文本,原有换行、空白、标题结构完整保留 clean_text = content_box.text print(clean_text)
方案优势
- 不依赖正则文本匹配,不会出现截断位置错误、误删正文的问题
- 基于DOM节点删除冗余内容,除了参考文献板块外,页脚的外部链接、导航栏、版权声明等尾部冗余内容会被一并清除
- 直接调用容器原生的
text属性提取内容,原有的段落空行、标题换行格式完全保留,不需要手动拼接不同标签的内容,不会出现格式错乱 - 适配所有语言的维基百科页面,只需要修改锚点id为对应语言的“参考文献”即可
之前两种方案失效的原因
- 遍历span标签的方案:
mw-content-text是div标签的class,不是span标签的属性,选择器从一开始就没找到目标元素;且内层循环中text是存储节点的列表,直接调用.text属性必然报错。 - 仅提取p标签的方案:维基页面的各级标题是h1~h6标签,信息框、目录等结构也不在p标签内,仅提取p标签会丢失所有标题结构,再手动替换所有换行符后,自然会变成无格式的混乱文本。
内容的提问来源于stack exchange,提问作者Maddayum
相关产品推荐
相关产品推荐

