如何将原始不受信任的文本传递给 Python 中的 feedparser.parse 方法?
How do I pass raw untrusted text to feedparser.parse method in Python?
- 我正在尝试使用 feedparser 来解析我使用 asyncio aiohttp 库下载的文本
- 提要文本可用HERE(大文档,因此不粘贴在这里)
- feedparser.parse 方法的文档提到您不应该直接向它发送不受信任的字符串 HERE on GitHub
这是我的代码,我试图将其包装到 StringIO class
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
- 如何将不受信任的文本传递给 Python feedparser.parse 方法以使消毒剂对其起作用?我的提要包含尚未删除的脚本标签。提前谢谢你
显然 feedparser.parse
内部需要一个 bytes
对象,它当前正在接收一个字符串,因为它将该对象传递给一个使用 bytes
模式的正则表达式匹配函数,并且要匹配的对象和模式需要具有相同的类型。
您可以通过将 open(..., 'r')
更改为 open(..., 'rb')
并使用 BytesIO
而不是 StringIO
来获得 bytes
对象。
根据@mkrieger1 的评论,这就是答案
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')
- 我正在尝试使用 feedparser 来解析我使用 asyncio aiohttp 库下载的文本
- 提要文本可用HERE(大文档,因此不粘贴在这里)
- feedparser.parse 方法的文档提到您不应该直接向它发送不受信任的字符串 HERE on GitHub
这是我的代码,我试图将其包装到 StringIO class
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
- 如何将不受信任的文本传递给 Python feedparser.parse 方法以使消毒剂对其起作用?我的提要包含尚未删除的脚本标签。提前谢谢你
显然 feedparser.parse
内部需要一个 bytes
对象,它当前正在接收一个字符串,因为它将该对象传递给一个使用 bytes
模式的正则表达式匹配函数,并且要匹配的对象和模式需要具有相同的类型。
您可以通过将 open(..., 'r')
更改为 open(..., 'rb')
并使用 BytesIO
而不是 StringIO
来获得 bytes
对象。
根据@mkrieger1 的评论,这就是答案
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')