You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 07:21:26