Python 3.x 在Python中,如何将原始的不受信任文本传递给feedparser.parse方法? 我正在尝试使用feedparser来解析使用asyncio aiohttp库下载的文本 提要文本可用(大文档,因此不粘贴在此处) feedparser.parse方法的文档中提到,不应直接向其发送不受信任的字符串
这是我的代码,我试图将其包装到StringIO类中Python 3.x 在Python中,如何将原始的不受信任文本传递给feedparser.parse方法? 我正在尝试使用feedparser来解析使用asyncio aiohttp库下载的文本 提要文本可用(大文档,因此不粘贴在此处) feedparser.parse方法的文档中提到,不应直接向其发送不受信任的字符串,python-3.x,sanitize,feedparser,stringio,Python 3.x,Sanitize,Feedparser,Stringio,这是我的代码,我试图将其包装到StringIO类中 import feedparser import io def read(): import os name = os.path.join(os.getcwd(), 'extras', 'feeds', 'zycrypto.com_1596955288219') f = open(name, "r") text = f.read() f
import feedparser
import io
def read():
import os
name = os.path.join(os.getcwd(), 'extras', 'feeds',
'zycrypto.com_1596955288219')
f = open(name, "r")
text = f.read()
f.close()
return text
text = read()
parsed = feedparser.parse(io.StringIO(text))
for i in parsed.entries:
print(i.summary, '\n')
然而,我不断得到这个错误
Traceback (most recent call last):
File "./server/python/test.py", line 14, in <module>
parsed = feedparser.parse(io.StringIO(text))
File "/Users/zup/.local/share/virtualenvs/myapp_v3-kUGnE3_O/lib/python3.7/site-packages/feedparser.py", line 3922, in parse
data, result['encoding'], error = convert_to_utf8(http_headers, data)
File "/Users/zup/.local/share/virtualenvs/myapp_v3-kUGnE3_O/lib/python3.7/site-packages/feedparser.py", line 3574, in convert_to_utf8
xml_encoding_match = RE_XML_PI_ENCODING.match(tempdata)
TypeError: cannot use a bytes pattern on a string-like object
回溯(最近一次呼叫最后一次):
文件“/server/python/test.py”,第14行,在
parsed=feedparser.parse(io.StringIO(文本))
文件“/Users/zup/.local/share/virtualenvs/myapp_v3-kUGnE3_O/lib/python3.7/site packages/feedparser.py”,第3922行,在parse中
数据,结果['encoding'],错误=convert_to_utf8(http_头,数据)
文件“/Users/zup/.local/share/virtualenvs/myapp\u v3-kUGnE3\u O/lib/python3.7/site packages/feedparser.py”,第3574行,转换为utf8
xml\u encoding\u match=RE\u xml\u PI\u encoding.match(tempdata)
TypeError:无法在类似字符串的对象上使用字节模式
- 如何将不受信任的文本传递给Python feedparser.parse方法,以使消毒剂在其上工作?“我的订阅源”包含尚未删除的脚本标记。先谢谢你
feedparser。parse
内部需要一个bytes
对象,它当前正在接收字符串,因为它将该对象传递给正则表达式匹配函数,在该函数中使用bytes
模式,要匹配的对象和模式需要具有相同的类型
您可以通过将
open(…,'r')
更改为open(…,'rb')
并使用BytesIO
而不是@mkrieger1的注释中的StringIO
来获取bytes
对象,这就是答案
import feedparser
import io
def read():
import os
name = os.path.join(os.getcwd(), 'extras', 'feeds',
'zycrypto.com_1596955288219')
f = open(name, "r")
text = f.read()
f.close()
return text
text = read()
parsed = feedparser.parse(io.BytesIO(bytes(text, 'utf-8')))
for i in parsed.entries:
print(i.summary, '\n')
为什么要使用
StringIO
,而不是将text
,甚至f
,传递给feedparser.parse
?@mkrieger1因为文档中说不要传递不受信任的字符串,我在问题中强调了这一点,在我的实际应用程序中,我从asyncio aiohttp库获取数据,我想在这里创建一个可以复制的简单案例,您会注意到,在我包含的测试数据中,html根本没有经过消毒,脚本标记仍然存在于最终版本中output@mkrieger1那么,由于当前输出根本没有经过消毒,如何对输出进行消毒呢,当您在entriesworks上循环时,它仍然有那些脚本标记,但仍然没有进行清理,根据SO规则,我将不得不问一个单独的问题:(