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

如何向Python的feedparser.parse传入不可信原始文本?

解决feedparser解析不可信文本的错误并启用Sanitizer

嘿,我来帮你解决遇到的这两个问题:先是那个烦人的类型错误,然后是确保script标签被正确移除的sanitizer设置。

一、搞定"cannot use a bytes pattern on a string-like object"错误

你碰到的这个类型错误,根源是feedparser.parse在处理io.StringIO(字符串流)时,内部逻辑其实期望的是字节流。当你传入字符串流后,后续的编码转换步骤会用字节类型的正则表达式去匹配字符串对象,自然就报错了。

解决方法很简单,把字符串转成字节,用io.BytesIO包装后再传入就行:

import feedparser
import io
import os

def read():
    name = os.path.join(os.getcwd(), 'extras', 'feeds', 'zycrypto.com_1596955288219')
    # 用with语句自动关文件,比手动close靠谱多了
    with open(name, "r", encoding="utf-8") as f:
        text = f.read()
    return text

text = read()
# 把字符串编码成字节,用BytesIO包装后传入
parsed = feedparser.parse(io.BytesIO(text.encode('utf-8')))

for i in parsed.entries:
    print(i.summary, '\n')

顺便提一句,用with语句管理文件是Python里的最佳实践,能避免因为忘记close文件导致的资源泄漏问题。

二、启用Sanitizer彻底移除Script标签

feedparser默认是会做内容清理的,但如果你发现Feed里的script标签还在,最好显式开启sanitize参数(虽然默认是True,但明着写出来更保险):

parsed = feedparser.parse(io.BytesIO(text.encode('utf-8')), sanitize=True)

如果默认的清理力度不够,你还可以自定义一个sanitizer类,增强对script标签的过滤:

import re
from feedparser.sanitizer import HTMLSanitizer

class CustomSanitizer(HTMLSanitizer):
    def sanitize(self, html):
        # 先调用父类的默认清理逻辑
        cleaned_html = super().sanitize(html)
        # 额外把script标签连内容一起删掉
        cleaned_html = re.sub(r'<script.*?</script>', '', cleaned_html, flags=re.DOTALL)
        return cleaned_html

# 解析时指定用我们自定义的sanitizer
parsed = feedparser.parse(io.BytesIO(text.encode('utf-8')), sanitizer=CustomSanitizer)

三、为啥不能直接传不可信字符串?

feedparser文档提醒别直接传不可信字符串,是因为直接传字符串时,feedparser会跳过一些编码检测和sanitization的前置流程。而通过类文件对象(比如BytesIO)传入时,它会按照处理网络请求响应的完整流程来处理,包括正确的编码转换和安全清理,这样处理不可信内容才更安全。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 19:12:50