当我尝试使用以下网址从Google weather API检索信息时,

http://www.google.com/ig/api ?天气=慕尼黑,德国&安培; HL = DE

然后尝试用minidom解析它,我收到文档格式不正确的错误。

我使用以下代码

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的答案中取出一条线。

其他提示

这似乎有效:

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