Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 在Python中,如何将原始的不受信任文本传递给feedparser.parse方法? 我正在尝试使用feedparser来解析使用asyncio aiohttp库下载的文本 提要文本可用(大文档,因此不粘贴在此处) feedparser.parse方法的文档中提到,不应直接向其发送不受信任的字符串_Python 3.x_Sanitize_Feedparser_Stringio - Fatal编程技术网

Python 3.x 在Python中,如何将原始的不受信任文本传递给feedparser.parse方法? 我正在尝试使用feedparser来解析使用asyncio aiohttp库下载的文本 提要文本可用(大文档,因此不粘贴在此处) feedparser.parse方法的文档中提到,不应直接向其发送不受信任的字符串

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

这是我的代码,我试图将其包装到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.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规则,我将不得不问一个单独的问题:(