【问题标题】:XML in Python and lxmlPython 和 lxml 中的 XML
【发布时间】:2015-03-16 22:39:06
【问题描述】:

我正在使用返回 XML 文件的 pinnacle(投注)api。目前,我将其保存为 .xml 文件,如下所示:

req = urllib2.Request(url, headers=headers)
responseData = urllib2.urlopen(req).read()

ofn = 'pinnacle_feed_basketball.xml'
with open(ofn, 'w') as ofile:
    ofile.write(responseData)
parse_xml()

然后在parse_xml函数中打开

tree = etree.parse("pinnacle_feed_basketball.xml")
fdtime = tree.xpath('//rsp/fd/fdTime/text()')

我假设将其保存为 XML 文件,然后无需读取该文件,但如果不这样做,我将无法使其工作。

我尝试将responseData 传递给parsexml() 函数

parse_xml(responseData)

然后在函数中

tree = etree.parse(responseData)
fdtime = tree.xpath('//rsp/fd/fdTime/text()')

但它不起作用。

【问题讨论】:

  • 如果你想解析一个内存对象(在你的例子中是一个字符串),使用etree.fromstring(<obj>) -- etree.parse 需要一个类似文件的对象 -- Docs

标签: python xml xml-parsing lxml


【解决方案1】:

如果您想解析内存中的对象(在您的情况下是字符串),请使用 etree.fromstring(<obj>) -- etree.parse 需要类似文件的对象或文件名 -- Docs

例如:

import urllib2, lxml.etree as etree

url = 'http://www.xmlfiles.com/examples/note.xml'
headers = {}

req = urllib2.Request(url, headers=headers)
responseData = urllib2.urlopen(req).read()

element = etree.fromstring(responseData)
print(element)
print(etree.tostring(element, pretty_print=True))

输出:

<Element note at 0x2c29dc8>
<note>
  <to>Tove</to>
  <from>Jani</from>
  <heading>Reminder</heading>
  <body>Don't forget me this weekend!</body>
</note>

【讨论】:

    【解决方案2】:

    parse() 旨在读取file-like objects

    但是你在这两种情况下都传递了一个字符串——pinnacle_feed_basketball.xml 字符串和responseData,这也是一个字符串。

    在第一种情况下应该是:

    with open("pinnacle_feed_basketball.xml") as f:
        tree = etree.parse(f)
    

    第二种情况:

    root = etree.fromstring(responseData)  # note that you are not getting an "ElementTree" object here
    

    仅供参考,urllib2.urlopen(req) 也是一个类似文件的对象

    tree = etree.parse(urllib2.urlopen(req))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-29
      • 2012-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多