2014-10-30 36 views
0

的代码是自我解释...字节STR转换失败python3

$ 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 
+0

为什么不使用知道如何通过HTTP正确处理HTML的模块? – 2014-10-30 05:08:57

+0

@ IgnacioVazquez-Abrams,你能解释一下吗? read()方法适用于大多数url。 – Dewsworld 2014-10-30 05:10:20

+0

'read()'方法不会告诉你有关服务器告诉你HTML的字符集的任何信息。 – 2014-10-30 05:10:59

回答

0

似乎是在信息的一些不好的Unicode字符您从URL因此需要某种错误处理得到。为什么不使用请求,即“用Python编写的HTTP库,用于人类”。并让它处理细节:

$ 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< 
>>> 
0

html页面可能有inconsistent encodings。内容类型HTTP标头(res.headers.get_content_charset())表示它是'utf-8'<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />里面的html文件证实了它。但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创作工具错误的字符编码规范。