在Python中打开远程文档
问题描述:
from xml.dom.minidom import parse, parseString
datasource = open('http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml')
dom = parse(datasource)
print dom
...上面的代码会抛出一个IOError: 2, 'No such file or directory'
。 Python不会像PHP一样阅读远程文档?我需要在代码中更改什么来使其读取XML文件?在Python中打开远程文档
谢谢
答
>>> import urllib2
>>> from xml.dom.minidom import parse, parseString
>>> u1=urllib2.urlopen('http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml')
>>> dom=parse(u1)
>>> print dom
<xml.dom.minidom.Document instance at 0x017D73A0>
>>> dom.childNodes
[<DOM Element: gesmes:Envelope at 0x17d7c88>]
>>> dom.childNodes[0].childNodes
[<DOM Text node "u'\n\t'">, <DOM Element: gesmes:subject at 0x1041aa8>,
<DOM Text node "u'\n\t'">, <DOM Element: gesmes:Sender at 0xff8260>,
<DOM Text node "u'\n\t'">, <DOM Element: Cube at 0x17d3dc8>, <DOM Text node "u'\n'">]
>>>
该XML使用太多构建一个Cube
标签,所以选择货币变得有点令人陶醉。
>>> [elem.attributes['currency'].value for elem in
dom.getElementsByTagName('Cube') if elem.hasAttribute('currency')]
[u'USD', u'JPY', u'BGN', u'CZK', u'DKK', u'EEK', u'GBP', u'HUF', u'LTL', u'LVL',
u'PLN', u'RON', u'SEK', u'CHF', u'NOK', u'HRK', u'RUB', u'TRY', u'AUD', u'BRL',
u'CAD', u'CNY', u'HKD', u'IDR', u'INR', u'KRW', u'MXN', u'MYR', u'NZD', u'PHP',
u'SGD', u'THB', u'ZAR']
>>>
答
open
用来打开本地文件系统上的文件。它无法打开网址。您必须使用urllib.urlopen
,它将返回支持API子集的类似文件的文件。
答
import urllib.request
from xml.dom import minidom
response = urllib.request.urlopen('http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml')
results = response.read()
#print(results)
xmldoc = minidom.parseString(results)
itemlist = xmldoc.getElementsByTagName('Cube')
# if itemlist[1].hasAttribute('time'):
# print("Yes it has")
# for s in itemlist[2].attributes.values():
# print(s.value)
# print(itemlist[2].attributes.values())
for s in itemlist:
if s.hasAttribute('currency'):
print(s.attributes['currency'].value + ' ' + s.attributes['rate'].value)
else:
pass
+0
请解释代码。如果OP能够理解这个概念,并且不仅仅获得一个复制/粘贴内容,那么这更好,因为这更具教育意义。 – lpapp 2014-02-01 16:47:44
谢谢你的列表理解,帮助了很多! – 3zzy 2010-01-19 09:00:58