【问题标题】:Opening remote documents in Python在 Python 中打开远程文档
【发布时间】:2011-01-06 16:32:38
【问题描述】:
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 xml parsing document


    【解决方案1】:

    使用urllib.urlopen()

    【讨论】:

    • urllib2.urlopen() 我相信做同样的事情,但它也与 v3.0 前向兼容
    【解决方案2】:

    urllib.urlopen() 方法返回一个File Object。所以你可以直接将它传递给你的parse() 方法

    【讨论】:

      【解决方案3】:

      open 用于打开本地文件系统上的文件。它无法打开 URL。您必须使用urllib.urlopen,它返回一个支持API 子集的类似文件的对象。

      【讨论】:

        【解决方案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']
        >>> 
        

        【讨论】:

        • 感谢列表理解,帮了大忙!
        【解决方案5】:
            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
        

        【讨论】:

        • 请解释一下代码。如果 OP 能够理解这个概念会更好,而不仅仅是复制/粘贴内容,因为这样更有教育意义。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-29
        • 1970-01-01
        • 2023-04-02
        • 2015-07-30
        • 1970-01-01
        相关资源
        最近更新 更多