一个非常简单的Python 3.6脚本需要的帮助。
首先,它从使用cp1251编码的老式服务器中下载HTML文件。
然后,我需要将文件内容放入UTF-8编码的字符串中。
这是我在做什么:
import requests
import codecs
#getting the file
ri = requests.get('http://old.moluch.ru/_python_test/0.html')
#checking that it's in cp1251
print(ri.encoding)
#encoding using cp1251
text = ri.text
text = codecs.encode(text,'cp1251')
#decoding using utf-8 - ERROR HERE!
text = codecs.decode(text,'utf-8')
print(text)
这是错误:
Traceback (most recent call last):
File "main.py", line 15, in <module>
text = codecs.decode(text,'utf-8')
File "/var/lang/lib/python3.6/encodings/utf_8.py", line 16, in decode
return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xca in position 43: invalid continuation byte
非常感谢您提供任何帮助。
答案 0 :(得分:2)
不确定您要做什么。
.text
是响应的文本,一个Python字符串。编码在Python字符串中不起作用。
仅当您有想要将字节流转换为(或相反)的字节流时,编码才起作用。请求模块已经为您做到了。
import requests
ri = requests.get('http://old.moluch.ru/_python_test/0.html')
print(ri.text)
例如,假设您有一个文本文件(即:字节)。然后,在open()
文件时必须选择一种编码-编码的选择决定了文件中的字节如何转换为字符。此手动步骤是必需的,因为open()
无法知道文件字节的编码方式。
HTTP在响应头(Content-Type
)中发送此消息,因此requests
可以知道此信息。作为高级模块,它有助于查看HTTP标头并为您转换传入的字节。 (如果要使用更底层的urllib
,则必须自己进行解码。)
当您使用响应的.encoding
时,.text
属性是纯信息性的。但是,如果您使用.raw
属性,则可能是相关的。对于与返回常规文本响应的服务器一起使用,几乎不需要使用.raw
。
答案 1 :(得分:1)
您不需要进行编码/解码。
“发出请求时,请求会根据HTTP标头对响应的编码进行有根据的猜测。访问r.text时将使用请求所猜测的文本编码。”
这将起作用:
import requests
#getting the file
ri = requests.get('http://old.moluch.ru/_python_test/0.html')
text = ri.text
print(text)
对于非文本请求,您还可以以字节形式访问响应正文:
ri.content
答案 2 :(得分:1)
当许多人已经回答您进行 requests.get 时,您将收到解码后的消息。我将回答您现在面临的错误。
此行:
text = codecs.encode(text,'cp1251')
将文本编码为cp1251,然后尝试使用utf-8对其进行解码,这会在此处出现错误:
text = codecs.decode(text,'utf-8')
要检测类型,可以使用:
import chardet
text = codecs.encode(text,'cp1251')
chardet.detect(text) . #output {'encoding': 'windows-1251', 'confidence': 0.99, 'language': 'Russian'}
#OR
text = codecs.encode(text,'utf-8')
chardet.detect(text) . #output {'encoding': 'utf-8', 'confidence': 0.99, 'language': ''}
因此以一种格式编码然后以另一种格式解码会导致错误。
答案 3 :(得分:-1)
您只需在解码功能中添加设置即可忽略该错误:
text = codecs.decode(text,'utf-8',errors='ignore')