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

如何使用urllib和bs4提取网页纯文本并去除特殊字符

解决方案

当然可行,你可以通过以下步骤解决问题:

1. 修正网页内容读取逻辑

你的代码中把urlopen(req).read()直接转为str是核心错误——这会将字节流以repr格式转换为字符串,导致出现\xc2、\x89这类字节转义符。正确的做法是直接将字节流解码为UTF-8字符串:

import bs4
from urllib.request import Request, urlopen
import re

url = "https://ar5iv.labs.arxiv.org/html/2309.10034"
req = Request(url=url, headers={'User-Agent': 'Mozilla/7.0'})
# 直接解码为UTF-8字符串,避免字节转义问题
webpage = urlopen(req).read().decode('utf-8')
# 指定解析器初始化BeautifulSoup,避免警告并提升稳定性
soup = bs4.BeautifulSoup(webpage, 'html.parser')

2. 分阶段清理文本

根据你需要的清理程度,选择对应的处理方式:

基础清理(保留合理文本格式)

先通过get_text()提取文本,再去除多余换行和连续空格:

# 以换行符为分隔符提取原始文本
raw_text = soup.get_text('\n')
# 移除重复换行
clean_text = re.sub(r'\n\s*\n', '\n', raw_text)
# 合并连续空格为单个空格并去除首尾空白
clean_text = re.sub(r'\s+', ' ', clean_text).strip()

彻底移除非ASCII字符(仅保留纯英文ASCII文本)

如果需要完全剔除非ASCII字符,添加正则替换:

# 移除所有不在ASCII范围内的字符
ascii_clean_text = re.sub(r'[^\x00-\x7F]+', '', clean_text)

处理LaTeX风格标记(如\subscript)

针对文本中出现的\subscript这类标记,可针对性移除:

# 移除\subscript及后续的括号内容(比如\subscript{2})
latex_clean_text = re.sub(r'\\subscript\{.*?\}', '', ascii_clean_text)

完整可运行代码

import bs4
from urllib.request import Request, urlopen
import re

url = "https://ar5iv.labs.arxiv.org/html/2309.10034"
req = Request(url=url, headers={'User-Agent': 'Mozilla/7.0'})
webpage = urlopen(req).read().decode('utf-8')
soup = bs4.BeautifulSoup(webpage, 'html.parser')

# 基础文本清理
raw_text = soup.get_text('\n')
clean_text = re.sub(r'\n\s*\n', '\n', raw_text)
clean_text = re.sub(r'\s+', ' ', clean_text).strip()

# 可选:移除非ASCII字符
clean_text = re.sub(r'[^\x00-\x7F]+', '', clean_text)
# 可选:移除LaTeX下标标记
clean_text = re.sub(r'\\subscript\{.*?\}', '', clean_text)

print(clean_text)

关键说明

  • 避免用str()转换字节流:字节流直接decode('utf-8')才能得到正确的网页文本内容。
  • 正则是灵活的清理工具:可根据实际出现的特殊标记调整正则规则,匹配并移除目标内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 10:59:51