与本地 HTTP 适配器输出垃圾的请求会话
Requests Session with local HTTP adapter output-ing junk
我正在读取 HTML 文件,保存在本地磁盘中,使用请求和 LocalFileAdapter,根据 Python requests fetch a file from a local url 上的 @b1r3k。相关部分是:requests_session = requests.session()
requests_session.mount('file://', LocalFileAdapter())
ra=requests_session.get('file://X:\somefile.htm')
print ra.content
。
我在控制台 上收到一些垃圾邮件。如果你仔细看,这些奇怪的方块隔开的是真实的字母表。我该怎么做才能使其易于阅读?
您有 UTF-16 编码数据和 BOM,打印到使用 Windows 1252 代码页的控制台:
>>> contents = u'''\
... <html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head>
... <meta http-equiv="Content-Type" content="text/html; charset=unicode">
... <meta name="ProgId" content="Word.Document">[snip]
... </body></html>'''
>>> contents.encode('utf16').decode('cp1252')
u'\xff\xfe<\x00h\x00t\x00m\x00l\x00 \x00x\x00m\x00l\x00n\x00s\x00:\x00v\x00=\x00"\x00u\x00r\x00n\x00:\x00s\x00c\x00h\x00e\x00m\x00a\x00s\x00-\x00m\x00i\x00c\x00r\x00o\x00s\x00o\x00f\x00t\x00-\x00c\x00o\x00m\x00:\x00v\x00m\x00l\x00"\x00 \x00x\x00m\x00l\x00n\x00s\x00:\x00o\x00=\x00"\x00u\x00r\x00n\x00:\x00s\x00c\x00h\x00e\x00m\x00a\x00s\x00-\x00m\x00i\x00c\x00r\x00o\x00s\x00o\x00f\x00t\x00-\x00c\x00o\x00m\x00:\x00o\x00f\x00f\x00i\x00c\x00e\x00:\x00o\x00f\x00f\x00i\x00c\x00e\x00"\x00 \x00x\x00m\x00l\x00n\x00s\x00:\x00w\x00=\x00"\x00u\x00r\x00n\x00:\x00s\x00c\x00h\x00e\x00m\x00a\x00s\x00-\x00m\x00i\x00c\x00r\x00o\x00s\x00o\x00f\x00t\x00-\x00c\x00o\x00m\x00:\x00o\x00f\x00f\x00i\x00c\x00e\x00:\x00w\x00o\x00r\x00d\x00"\x00 \x00x\x00m\x00l\x00n\x00s\x00:\x00m\x00=\x00"\x00h\x00t\x00t\x00p\x00:\x00/\x00/\x00s\x00c\x00h\x00e\x00m\x00a\x00s\x00.\x00m\x00i\x00c\x00r\x00o\x00s\x00o\x00f\x00t\x00.\x00c\x00o\x00m\x00/\x00o\x00f\x00f\x00i\x00c\x00e\x00/\x002\x000\x000\x004\x00/\x001\x002\x00/\x00o\x00m\x00m\x00l\x00"\x00 \x00x\x00m\x00l\x00n\x00s\x00=\x00"\x00h\x00t\x00t\x00p\x00:\x00/\x00/\x00w\x00w\x00w\x00.\x00w\x003\x00.\x00o\x00r\x00g\x00/\x00T\x00R\x00/\x00R\x00E\x00C\x00-\x00h\x00t\x00m\x00l\x004\x000\x00"\x00>\x00<\x00h\x00e\x00a\x00d\x00>\x00\n\x00<\x00m\x00e\x00t\x00a\x00 \x00h\x00t\x00t\x00p\x00-\x00e\x00q\x00u\x00i\x00v\x00=\x00"\x00C\x00o\x00n\x00t\x00e\x00n\x00t\x00-\x00T\x00y\x00p\x00e\x00"\x00 \x00c\x00o\x00n\x00t\x00e\x00n\x00t\x00=\x00"\x00t\x00e\x00x\x00t\x00/\x00h\x00t\x00m\x00l\x00;\x00 \x00c\x00h\x00a\x00r\x00s\x00e\x00t\x00=\x00u\x00n\x00i\x00c\x00o\x00d\x00e\x00"\x00>\x00\n\x00<\x00m\x00e\x00t\x00a\x00 \x00n\x00a\x00m\x00e\x00=\x00"\x00P\x00r\x00o\x00g\x00I\x00d\x00"\x00 \x00c\x00o\x00n\x00t\x00e\x00n\x00t\x00=\x00"\x00W\x00o\x00r\x00d\x00.\x00D\x00o\x00c\x00u\x00m\x00e\x00n\x00t\x00"\x00>\x00[\x00s\x00n\x00i\x00p\x00]\x00\n\x00<\x00/\x00b\x00o\x00d\x00y\x00>\x00<\x00/\x00h\x00t\x00m\x00l\x00>\x00'
>>> print contents.encode('utf16').decode('cp1252')[:2]
ÿþ
UTF16 byte order mark 打印为 ÿþ
,Unicode U+00FF 和 U+00FE 代码点。
对您的响应数据进行 UTF-16 解码:
print ra.content.decode('utf16')
您可能希望以 binary 模式打开文件,否则您的换行符将被打断。使用:
with open(file_path, 'rb') as file:
我已经更正了您引用的答案中的代码。
我正在读取 HTML 文件,保存在本地磁盘中,使用请求和 LocalFileAdapter,根据 Python requests fetch a file from a local url 上的 @b1r3k。相关部分是:requests_session = requests.session()
requests_session.mount('file://', LocalFileAdapter())
ra=requests_session.get('file://X:\somefile.htm')
print ra.content
。
我在控制台
您有 UTF-16 编码数据和 BOM,打印到使用 Windows 1252 代码页的控制台:
>>> contents = u'''\
... <html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head>
... <meta http-equiv="Content-Type" content="text/html; charset=unicode">
... <meta name="ProgId" content="Word.Document">[snip]
... </body></html>'''
>>> contents.encode('utf16').decode('cp1252')
u'\xff\xfe<\x00h\x00t\x00m\x00l\x00 \x00x\x00m\x00l\x00n\x00s\x00:\x00v\x00=\x00"\x00u\x00r\x00n\x00:\x00s\x00c\x00h\x00e\x00m\x00a\x00s\x00-\x00m\x00i\x00c\x00r\x00o\x00s\x00o\x00f\x00t\x00-\x00c\x00o\x00m\x00:\x00v\x00m\x00l\x00"\x00 \x00x\x00m\x00l\x00n\x00s\x00:\x00o\x00=\x00"\x00u\x00r\x00n\x00:\x00s\x00c\x00h\x00e\x00m\x00a\x00s\x00-\x00m\x00i\x00c\x00r\x00o\x00s\x00o\x00f\x00t\x00-\x00c\x00o\x00m\x00:\x00o\x00f\x00f\x00i\x00c\x00e\x00:\x00o\x00f\x00f\x00i\x00c\x00e\x00"\x00 \x00x\x00m\x00l\x00n\x00s\x00:\x00w\x00=\x00"\x00u\x00r\x00n\x00:\x00s\x00c\x00h\x00e\x00m\x00a\x00s\x00-\x00m\x00i\x00c\x00r\x00o\x00s\x00o\x00f\x00t\x00-\x00c\x00o\x00m\x00:\x00o\x00f\x00f\x00i\x00c\x00e\x00:\x00w\x00o\x00r\x00d\x00"\x00 \x00x\x00m\x00l\x00n\x00s\x00:\x00m\x00=\x00"\x00h\x00t\x00t\x00p\x00:\x00/\x00/\x00s\x00c\x00h\x00e\x00m\x00a\x00s\x00.\x00m\x00i\x00c\x00r\x00o\x00s\x00o\x00f\x00t\x00.\x00c\x00o\x00m\x00/\x00o\x00f\x00f\x00i\x00c\x00e\x00/\x002\x000\x000\x004\x00/\x001\x002\x00/\x00o\x00m\x00m\x00l\x00"\x00 \x00x\x00m\x00l\x00n\x00s\x00=\x00"\x00h\x00t\x00t\x00p\x00:\x00/\x00/\x00w\x00w\x00w\x00.\x00w\x003\x00.\x00o\x00r\x00g\x00/\x00T\x00R\x00/\x00R\x00E\x00C\x00-\x00h\x00t\x00m\x00l\x004\x000\x00"\x00>\x00<\x00h\x00e\x00a\x00d\x00>\x00\n\x00<\x00m\x00e\x00t\x00a\x00 \x00h\x00t\x00t\x00p\x00-\x00e\x00q\x00u\x00i\x00v\x00=\x00"\x00C\x00o\x00n\x00t\x00e\x00n\x00t\x00-\x00T\x00y\x00p\x00e\x00"\x00 \x00c\x00o\x00n\x00t\x00e\x00n\x00t\x00=\x00"\x00t\x00e\x00x\x00t\x00/\x00h\x00t\x00m\x00l\x00;\x00 \x00c\x00h\x00a\x00r\x00s\x00e\x00t\x00=\x00u\x00n\x00i\x00c\x00o\x00d\x00e\x00"\x00>\x00\n\x00<\x00m\x00e\x00t\x00a\x00 \x00n\x00a\x00m\x00e\x00=\x00"\x00P\x00r\x00o\x00g\x00I\x00d\x00"\x00 \x00c\x00o\x00n\x00t\x00e\x00n\x00t\x00=\x00"\x00W\x00o\x00r\x00d\x00.\x00D\x00o\x00c\x00u\x00m\x00e\x00n\x00t\x00"\x00>\x00[\x00s\x00n\x00i\x00p\x00]\x00\n\x00<\x00/\x00b\x00o\x00d\x00y\x00>\x00<\x00/\x00h\x00t\x00m\x00l\x00>\x00'
>>> print contents.encode('utf16').decode('cp1252')[:2]
ÿþ
UTF16 byte order mark 打印为 ÿþ
,Unicode U+00FF 和 U+00FE 代码点。
对您的响应数据进行 UTF-16 解码:
print ra.content.decode('utf16')
您可能希望以 binary 模式打开文件,否则您的换行符将被打断。使用:
with open(file_path, 'rb') as file:
我已经更正了您引用的答案中的代码。