2010-01-19 64 views
1
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中打開遠程文檔

謝謝

回答

4

使用urllib2.urlopen()

>>> 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'] 
>>> 
+0

謝謝你的列表理解,幫助了很多! – 3zzy 2010-01-19 09:00:58

0

使用urllib.urlopen()

+1

urllib2.urlopen()不,我相信同樣的事情,但它也有3.0向前兼容 – Roman 2010-01-19 06:43:33

1

open用來打開本地文件系統上的文件。它無法打開網址。您必須使用urllib.urlopen,它將返回支持API子集的類似文件的文件。

0
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