私はthis webpageからデータを抽出するためのpython Webスクレーパーに取り組んでいます。それは±、č、ę、ė、į、š、ų、ū、¼のようなラテン文字を含んでいます。私は、エンコーディングを認識するためにBeautifulSoupを使用します。常に使用するように思わラテン系のエンコーディングの問題
def decode_html(html_string):
converted = UnicodeDammit(html_string)
print(converted.original_encoding)
if not converted.unicode_markup:
raise UnicodeDecodeError(
"Failed to detect encoding, tried [%s]",
', '.join(converted.tried_encodings))
return converted.unicode_markup
エンコーディングは「窓-1252」です。しかし、これはファイルやコンソールに印刷するときにはëをëに、øをøに変換します。私はlxmlライブラリを使用してデータをスクラップします。だから私はそれが間違ったエンコーディングを使用すると思いますが、奇妙なのは、私がlxml.html.open_in_browser(decoded_html)
を使用すると、すべての文字が正常に戻ってしまうということです。どのように私はすべてのmojibakeなしで文字をファイルに印刷するのですか?
これは、私は、出力のために使用していますものです:あなたが負荷にしようとした特定のウェブページに設定されたHTTPヘッダから
def write(filename, obj):
with open(filename, "w", encoding="utf-8") as output:
json.dump(obj, output, cls=CustomEncoder, ensure_ascii=False)
return
これは、ドキュメント内で指定されたエンコーディングを常にcharsetヘッダーで指定されたエンコーディングで上書きするという点で、異なる潜在的な問題はありませんか? – pvg
@pvg:はい、サーバーが明示的にエンコーディング*を設定し、HTMLドキュメントが(メタヘッダーなどを介して)1つを設定する場合、この場合サーバーのcontent-typeが勝ちます。 HTML宣言を最初に探すソリューションで更新します。 –