3

Web サイトをスクレイピングしており、BeautifulSoup4を使用して解析しています。Web サイトには非常にランダムな文字セットが含まれている可能性があるため、 UnicodeDammit.detwingleを使用して、適切なデータを BeautifulSoup に確実にフィードします。それは正常に機能しました...クラッシュするまで。1 つの Web サイトがコードの破損を引き起こします。「スープ」を構築するコードは次のようになります。

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地獄のデュオ)

  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)

違反サイトはこちら

質問:適切で防弾のWeb サイト ソース デコーディングを作成する方法は?

4

1 に答える 1

4

この Web サイトは、文字エンコーディングに関して特別なケースではありません。http ヘッダーが正しく設定されていても、完全に有効な utf-8 です。したがって、コード ポイントが ASCII を超える utf-8 でエンコードされた Web サイトでは、コードがクラッシュすることになります。

UnicodeDammit.detwingleUnicode 文字列を取るドキュメントからも明らかです。あなたはそれを渡していhtml_blobます.変数の命名は、それがデコードされたユニコード文字列ではないことを示唆しています.(誤解)

httpヘッダーまたはマークアップがエンコーディングに関するものであるか、まったく含まれていない場合、Webサイトのエンコーディングを処理することは簡単ではありません。さまざまなヒューリスティックを実行する必要がありますが、それでもうまくいきません。しかし、この Web サイトは文字セット ヘッダーを正しく送信しており、その文字セットで正しくエンコードされています。


興味深い雑学。Web サイトの ASCII 以外のテキストは、次の JavaScript コメントのみです (utf-8 としてデコードされた後)。

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
于 2012-12-11T15:50:57.033 に答える