Python urllib、minidom、および国際文字の解析
-
05-07-2019 - |
質問
次のURLを使用してGoogle Weather APIから情報を取得しようとすると、
http://www.google.com/ig/api ?weather =ミュンヘン、ドイツ& hl = de
そしてミニダムでそれを解析しようとすると、ドキュメントの形式が正しくないというエラーが表示されます。
次のコードを使用します
sock = urllib.urlopen(url) # above mentioned url
doc = minidom.parse(sock)
応答のドイツ語の文字がエラーの原因だと思います。
これを行う正しい方法は何ですか?
解決
pythonのurllib.urlopenによると、ヘッダーで送信されるエンコーディングはiso-8859-1です(この場合、firefoxのライブhttpヘッダーは私と一致しないようです-utf-8を報告します)。 xml自体にはエンコードが指定されていません-> xml.dom.minidomがutf-8であると想定しているのはそのためです。
したがって、以下はこの特定の問題を修正する必要があります。
import urllib
from xml.dom import minidom
sock = urllib.urlopen('http://www.google.com/ig/api?weather=Munich,Germany&hl=de')
s = sock.read()
encoding = sock.headers['Content-type'].split('charset=')[1] # iso-8859-1
doc = minidom.parseString(s.decode(encoding).encode('utf-8'))
編集:Glenn Maynardのコメントの後、この回答を更新しました。 Lennert Regebroの回答から1行を削除する自由を取りました。
他のヒント
これは動作しているようです:
sock = urllib.urlopen(url)
# There is a nicer way for this, but I don't remember right now:
encoding = sock.headers['Content-type'].split('charset=')[1]
data = sock.read()
dom = minidom.parseString(data.decode(encoding).encode('ascii', 'xmlcharrefreplace'))
minidomは非ASCIIを処理しません。代わりに、lxmlを調べたい場合があります。
所属していません StackOverflow