Открытие удаленных документов в Python

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

... приведенный выше код выдает a IOError: 2, 'No such file or directory'. Python не читает удаленный doc, как PHP? Что мне нужно изменить в коде, чтобы он читал XML файл?

Спасибо

Теги:
document
parsing

5 ответов

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
    Спасибо за понимание списка, очень помогли!
1

open используется для открытия файла в локальной файловой системе. Он не может открывать URL-адреса. Вы должны использовать 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
    Пожалуйста, объясните код тоже. Лучше, если ОП сможет понять концепцию, а не просто получить содержимое для копирования / вставки, поскольку это более познавательно.
0

метод urllib.urlopen() возвращает File Object. Таким образом, вы можете напрямую передать его вашему методу parse()

0

Используйте urllib.urlopen().

  • 1
    urllib2.urlopen () делает то же самое, что я считаю, но он также совместим с v3.0

Ещё вопросы

Сообщество Overcoder
Наверх
Меню