質問

次の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を調べたい場合があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top