Python urllib,minidom和解析国际字符
-
05-07-2019 - |
题
当我尝试使用以下网址从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,而不是。
不隶属于 StackOverflow