UnicodeDammit:Detwingle在网站上崩溃

我废弃网站并使用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
上一篇:从Python代码将字符串插入SQLite数据库时出错


下一篇:基于Locust框架进行文件上传下载性能测试​