2012-01-18 18 views
2

私は、UTF-8でエンコードされたhtmlファイルを解析するためにBeautifulSoupを試しています。しかし、残念なことに、このhtmlファイルにはutf-8以外の文字が含まれているため正しく表示されません。しかし、私はこれらの文字を単にスキップすることができるので、これは私にとっては問題ありません。utf-8エンコードhtmlファイルにutf-8以外の文字が含まれているとどうなりますか?

の問題は、私が直接UTF-8としてencodingFromを指定した場合でも、次のとおりです。

soup = BeautifulSoup (html,fromEncoding='utf-8') 

それはsoup.originalEncodingが自動的にWindows-1252をデフォルトに設定されているが判明しました。

print soup.originalEncoding 
windows-1252 

私はBeautifulSoupのドキュメントを参照し、のように書かれています:私ではなく、リスト内の最後の1に落ちるの指定fromEncodingを使用する必要がありそうです

Beautiful Soup tries the following encodings, in order of priority, to turn your document into Unicode: 

- An encoding you pass in as the fromEncoding argument to the soup 
    constructor. 
- An encoding discovered in the document itself 
- An encoding sniffed by looking at the first few bytes of the file. If 
    an encoding is detected at this stage, it will be one of the UTF-* 
    encodings, EBCDIC, or ASCII. 
- An encoding sniffed by the chardet library, if you have it installed. 
- UTF-8 
- Windows-1252 

参考のためthe original html I'm parsingです。

+0

@joelgoldstick、私は意図的なエンコーディングは、(htmlのヘッダー部分から)utf-8にする必要があります。しかし、このファイルには、utf-8エンコーディングではない文字が含まれている可能性があります(ただし、おそらくwindows-1252)。それが理由かもしれません。しかし、私はutf-8の部分を取得し、windows-1252の部分を省略することを好むでしょう。 –

答えて

3

ファイルのエンコーディングが分かっている場合は、文字列をデコードしてからBeautifulSoupに渡し、utf8以外の文字は明示的に無視してみてください。

unicode_html = myfile.read().decode('utf-8', 'ignore') 
soup = BeautifulSoup (unicode_html) 
0

あなたが参照するページは、一般的にUTF-8でエンコードされているようですが、UTF-8でエンコードされたデータでは表示できないバイトシーケンスが含まれています。おそらく、不正なコード変換や別のエンコーディングへのデータの挿入が原因です。しかし、それは「唯一の」コンテンツデータです。

UTF-8は誤ったバイトをスキップするだけで、残りの部分はうまくいくはずです.HTMLマークアップを取得するとすぐにすべてがASCII範囲に入ります。マークアップの意味のある文字は常に0x80より小さい単一バイトとして表示されます。

+0

私は同意しますが、beautifulsoupを使用して解決策を見つけることができませんでした。指定したエンコーディング(fromEncoding)が何であれ、UTF-8でエンコードされたデータで表示されないバイトシーケンスがあるため、常にwindows-1252になります。 –

関連する問題