私はpyqueryを使用してページを解析しています:
dom = PyQuery('http://zh.wikipedia.org/w/index.php', {'title': 'CSS', 'printable': 'yes', 'variant': 'zh-cn'})
content = dom('#mw-content-text > p').eq(0).text()
しかし、私がcontent
で取得するのは、utf-8でエンコードされたコンテンツを含むUnicode文字列です。
u'\xe5\xb1\x82\xe5\x8f\xa0\xe6\xa0\xb7\xe5\xbc\x8f\xe8\xa1\xa8...'
内容を失わずにstr
に変換するにはどうすればよいですか?
明確にするために:
欲しいconent == '\xe5\xb1\x82\xe5\x8f\xa0\xe6\xa0\xb7\xe5\xbc\x8f\xe8\xa1\xa8'
conent == u'\xe5\xb1\x82\xe5\x8f\xa0\xe6\xa0\xb7\xe5\xbc\x8f\xe8\xa1\xa8'
ではない
UTF-8バイトのunicode
値がある場合、「バイト」を保持するためにLatin-1にエンコードします。
content = content.encode('latin1')
unicodeコードポイントU + 0000からU + 00FFはすべて、latin-1エンコーディングで1対1にマッピングされるためです。したがって、このエンコーディングはデータをリテラルバイトとして解釈します。
あなたの例では、これは私に与えます:
>>> content = u'\xe5\xb1\x82\xe5\x8f\xa0\xe6\xa0\xb7\xe5\xbc\x8f\xe8\xa1\xa8'
>>> content.encode('latin1')
'\xe5\xb1\x82\xe5\x8f\xa0\xe6\xa0\xb7\xe5\xbc\x8f\xe8\xa1\xa8'
>>> content.encode('latin1').decode('utf8')
u'\u5c42\u53e0\u6837\u5f0f\u8868'
>>> print content.encode('latin1').decode('utf8')
层叠样式表
PyQuery
はrequests
またはurllib
を使用してHTMLを取得し、requests
の場合は応答の.text
属性を使用します。これは、Content-Type
ヘッダーのみで設定されたエンコードに基づいて応答データを自動デコードします。または、その情報が利用できない場合は、latin-1
を使用します(テキスト応答の場合、HTMLはテキスト応答です)。 。 encoding
引数を渡すことで、これをオーバーライドできます。
dom = PyQuery('http://zh.wikipedia.org/w/index.php', encoding='utf8',
{'title': 'CSS', 'printable': 'yes', 'variant': 'zh-cn'})
その時点で、再エンコードする必要はまったくありません。