python3中的字节到str转换失败

时间:2014-10-30 05:08:00

标签: python-3.x character-encoding

代码是自我解释的......

$ python3
Python 3.4.0 (default, Apr 11 2014, 13:05:18) 
[GCC 4.8.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import urllib.request as req
>>> url = 'http://bangladeshbrands.com/342560550782-44083.html'
>>> res = req.urlopen(url)
>>> html = res.read() 
>>> type(html)
<class 'bytes'>
>>> html = html.decode('utf-8') # bytes -> str
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x92 in position 66081: invalid start byte

2 个答案:

答案 0 :(得分:0)

在您从网址获取的信息中似乎存在一些错误的unicode字符,因此需要进行某种错误处理。为什么不为人类使用请求,一个用Python编写的HTTP库。&#34;并让它处理细节:

$ python3
Python 3.4.2 (default, Oct 15 2014, 22:01:37) 
[GCC 4.2.1 Compatible Apple LLVM 5.1 (clang-503.0.40)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import requests
>>> url = 'http://bangladeshbrands.com/342560550782-44083.html'
>>> r = requests.get(url)
>>> html_as_text = r.text
>>> print(html_as_text[66070:66090])
ml">Toddler�s items<
>>> 

答案 1 :(得分:0)

html页面可能有inconsistent encodings。内容类型HTTP标头(res.headers.get_content_charset())表示它是'utf-8'。 html文档中的<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />确认了它。但是html.decode('utf-8')失败了。

似乎问题在于智能引用"’" (U + 2019 RIGHT SINGLE QUOTATION MARK)。它使用cp1252编码b'\x92'UnicodeDecodeError消息中的字节)进行编码。要解决此问题,您可以使用UnicodeDammit.detwingle()

from bs4 import UnicodeDammit # $ pip install beautifulsoup4

text = UnicodeDammit.detwingle(html).decode('utf-8')

虽然对于这个特定的文档,html.decode('cp1252')产生相同的结果,即http服务器和html创作工具可能只是错误的字符编码规范。