Python UnicodeAmmit:detwingle在网站上崩溃

Python UnicodeAmmit:detwingle在网站上崩溃,python,unicode,beautifulsoup,Python,Unicode,Beautifulsoup,我废弃网站并用它来解析它们。由于websits可以有真正随机的字符集,我使用它来确保向BeautifulSoup提供正确的数据。它工作得很好。。。直到它坠毁。一个网站导致代码中断。构建“soup”的代码如下所示: u = bs.UnicodeDammit.detwingle( html_blob ) <--- here it crashes u = bs.UnicodeDammit( u.decode('utf-8'), smart_quote

我废弃网站并用它来解析它们。由于websits可以有真正随机的字符集,我使用它来确保向BeautifulSoup提供正确的数据。它工作得很好。。。直到它坠毁。一个网站导致代码中断。构建“soup”的代码如下所示:

u = bs.UnicodeDammit.detwingle( html_blob ) <--- here it crashes
u = bs.UnicodeDammit( u.decode('utf-8'), 
                      smart_quotes_to='html', 
                      is_html = True )
u = u.unicode_markup
soup = bs.BeautifulSoup( u ) 
有问题的网站是


问题:如何进行正确的防弹网站源代码解码?

该网站在字符编码方面根本不是特例,即使http头设置正确,它也是完全有效的utf-8。然后,您的代码将在任何以utf-8编码的网站上崩溃,代码点超过ASCII

从文档中还可以明显看出,
unicodemammit.detwingle
采用unicode字符串。您正在传递它
html\u blob
,变量命名表明它不是已解码的unicode字符串。(误解)

在http头或标记与编码有关或根本不包含的情况下,处理任何网站编码都不是一件小事。您需要执行各种试探法,即使这样,您也不会得到正确的结果。但该网站正在正确发送字符集标题,并且已在该字符集中正确编码


有趣的琐事。网站中唯一超越ASCII的文本是这些javascript注释(解码为utf-8后):

如果将这些编码为ISO-8859-1,并将结果解码为GB2312,则会得到:

image = new Array(4); //定义image为图片数量的数组
image[0] = 'sample_BG_image01.png' //背景图象的路径
谷歌中文->英文,翻译为:

image = new Array(4); //Defined image of the array of the number of images
image[0] = 'sample_BG_image01.png' //The path of the background image

对于调试,我建议使用
'wb'
而不是
'w'
打开转储文件,并且只使用
fh.write(html\u blob)
。希望这有帮助。(这将以二进制而不是文本的形式打开文件,因此python不会尝试重新编码您正在编写的二进制输出)@JonasWielicki:谢谢,我完全没有抓住这一点。我编辑了这个问题并删除了这个问题以供评论。那么,你有没有一个有效的方法来正确解码页面,而不会崩溃
dewingle
+
utf8
在大多数情况下都适用于我,现在我看到它并不像我想的那样防弹……嗯,我至少在遵循HTML规范时不会遇到解码错误,也就是说,读取内容类型标题,如果不存在,请查找匹配的标记。如果这没有帮助,我尝试utf8和latin1(比较和,哪一个可以做到这一点)
image = new Array(4); //定义image为图片数量的数组
image[0] = 'sample_BG_image01.png' //背景图象的路径
image = new Array(4); //Defined image of the array of the number of images
image[0] = 'sample_BG_image01.png' //The path of the background image