0

我正在尝试从服务器获取 XML 文件(使用 Python 3.2.3),但我不断收到“没有这样的文件或目录”的错误消息。我确定 URL 是正确的,因为它会在错误消息中输出 URL,我可以复制并粘贴它并将其加载到我的浏览器中。所以我很困惑这是怎么发生的。这是我的代码:

import xml.etree.ElementTree as etree

class Blah(object):

    def getXML(self,xmlurl):
        tree = etree.parse(xmlurl)
        return tree.getroot()

    def pregameData(self,url):
        try:
            x = self.getXML('{0}linescore.xml'.format(url))
        except IOError as err:
            x = "I/O error: {0}".format(err)
        return x


if __name__ == '__main__':

    x = Blah()
    l = ['http://gd2.mlb.com/components/game/mlb/year_2013/month_04/day_15/gid_2013_04_15_anamlb_minmlb_1/',
         'http://gd2.mlb.com/components/game/mlb/year_2013/month_04/day_15/gid_2013_04_15_phimlb_cinmlb_1/',
         'http://gd2.mlb.com/components/game/mlb/year_2013/month_04/day_15/gid_2013_04_15_slnmlb_pitmlb_1/'
        ]
    for url in l:
        pre = x.pregameData(url)
        print(pre)

它总是返回这个错误:

I/O error: [Errno 2] No such file or directory: 'http://gd2.mlb.com/components/game/mlb/year_2013/month_04/day_15/gid_2013_04_15_anamlb_minmlb_1/linescore.xml'
I/O error: [Errno 2] No such file or directory: 'http://gd2.mlb.com/components/game/mlb/year_2013/month_04/day_15/gid_2013_04_15_phimlb_cinmlb_1/linescore.xml'
I/O error: [Errno 2] No such file or directory: 'http://gd2.mlb.com/components/game/mlb/year_2013/month_04/day_15/gid_2013_04_15_slnmlb_pitmlb_1/linescore.xml'

您可以复制并粘贴这些 URL,并查看这些位置中是否存在文件。我什至将文件和目录复制到本地主机,并尝试将其作为本地主机,以防外部服务器出现某种阻塞。它给了我同样的错误,所以这不是问题。我想知道Etree 的 parse()是否无法处理 HTTP,但文档没有说明这一点,所以我猜这也不是问题。

更新:正如评论中所建议的,我使用 using open(),但它仍然返回错误。导入和尝试urllib.request.urlopen(url)返回错误AttributeError: 'module' object has no attribute 'request'

4

1 回答 1

0

你是对的,xml.etree不会自动下载和解析 url,如果你想这样做,你需要先自己下载(使用 urllib 或 requests ...)。

文档明确指出parse需要一个文件名或文件对象,如果它支持一个 url,我相信它会明确说明。lxml.etree.parse()例如确实如此。

于 2013-04-15T17:52:32.310 回答