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

如何用Beautiful Soup提取网页纯文本内容用于新闻解析?

用Beautiful Soup或其他库提取网页纯文本的最优方案

核心思路:利用内置方法+提前清理无效标签

你完全不用手动遍历嵌套标签,Beautiful Soup和其他HTML解析库都有现成的文本提取能力,同时可以轻松过滤掉script、style这类浏览器不渲染的元素,步骤如下:


1. 基于Beautiful Soup的实现步骤

第一步:清理无效标签

先从article节点中移除所有不需要的标签(比如script、style、noscript),避免这些标签里的内容混入结果:

from bs4 import BeautifulSoup

# 假设你已经获取了目标article标签对象,示例:
# soup = BeautifulSoup(html_content, 'html.parser')
# article_node = soup.find('article')

# 定义要移除的无效标签列表
unwanted_tags = ['script', 'style', 'noscript', 'iframe']
for tag in article_node.find_all(unwanted_tags):
    tag.decompose()  # 彻底删除标签及其内容

第二步:提取纯文本

调用get_text()方法,它会自动遍历所有嵌套标签,提取所有可见文本,还能通过参数控制文本的分隔和空白处理:

# 用空格分隔文本,同时去除首尾和中间的多余空白
raw_text = article_node.get_text(strip=True, separator=' ')

第三步:优化标点格式(可选)

如果需要处理标点周围的多余空格,用简单正则调整:

import re
clean_text = re.sub(r'\s+([.,!?])', r'\1', raw_text)

用你提供的示例测试:
输入HTML:

<p>
    hello <b>world</b> </br> <img src="world.png">. fine <a href="#"> day </a> isn't it?
</p>

最终会得到:hello world. fine day isn't it?,完全符合预期。


2. 替代方案:使用lxml库

如果你习惯用lxml解析HTML,也可以用text_content()方法实现类似效果:

from lxml import html
import re

# 解析HTML并定位article节点
tree = html.fromstring(html_content)
article_node = tree.find('.//article')

# 移除无效标签
for tag in article_node.xpath('.//script|.//style|.//noscript'):
    tag.getparent().remove(tag)

# 提取并清理文本
raw_text = article_node.text_content().strip()
clean_text = re.sub(r'\s+', ' ', raw_text)
clean_text = re.sub(r'\s+([.,!?])', r'\1', clean_text)

为什么这是最优方案

  • 自动处理多层嵌套标签,无需手动递归遍历
  • 内置方法经过优化,效率远高于自定义遍历逻辑
  • 可以精准过滤掉所有非显示元素,避免无效内容干扰

内容的提问来源于stack exchange,提问作者Samuel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 21:50:38