我废弃网站并使用BeautifulSoup4对其进行解析.由于这些网站可以具有真正随机的字符集,因此我使用UnicodeDammit.detwingle来确保将正确的数据提供给BeautifulSoup.工作正常…直到崩溃.一个网站导致代码损坏.构建“汤”的代码如下所示:
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 )
和错误(标准Python-Unicode hello duo)
File ".../something.py", line 92, in load_bs_from_html_blob
u = bs.UnicodeDammit.detwingle( html_blob )
File ".../beautifulsoup4-4.1.3-py2.7.egg/bs4/dammit.py", line 802, in detwingle
return b''.join(byte_chunks)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 0:
ordinal not in range(128)
令人反感的网站是this one
问题:如何制作正确且防弹的网站源代码解码?
解决方法:
就字符编码而言,该网站绝不是什么特例,它是完全有效的utf-8,即使正确设置了http标头也是如此.这样一来,您的代码将在任何以utf-8编码且代码点超出ASCII的网站上崩溃.
从文档中还可以明显看出UnicodeDammit.detwingle采用unicode字符串.您将其传递给html_blob,并且变量命名表明它不是已解码的unicode字符串. (误解)
如果HTTP标头或标记位于该编码附近或根本不包含,则处理任何网站编码都不是一件容易的事.您需要执行各种启发式操作,即使那样,您也不会做对.但是此网站正在正确发送字符集标头,并且已在该字符集中正确编码.
有趣的琐事.这些javascript注释(在被解码为utf-8之后)是网站中唯一超出ASCII文本的文本:
image = new Array(4); //¶¨ÒåimageΪͼƬÊýÁ¿µÄÊý×é
image[0] = 'sample_BG_image01.png' //±³¾°Í¼ÏóµÄ·¾¶
如果然后将其编码为ISO-8859-1,并将结果解码为GB2312,则会得到:
image = new Array(4); //定义image为图片数量的数组
image[0] = 'sample_BG_image01.png' //背景图象的路径
哪个Google中文->英语,翻译为:
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