从网站解析Python XML

10

我正在尝试从一个网站解析数据,但遇到了困难。以下是来自网站的XML代码。我有两个问题:如何最好地从网站读取XML,并且我很难深入解析XML以获取我需要的汇率。

我需要的数据是Base:OBS_VALUE 0.12

目前我已经做到的:

from xml.dom import minidom
import urllib


document = ('http://www.newyorkfed.org/markets/omo/dmm/fftoXML.cfm?type=daily''r')
web = urllib.urlopen(document)
get_web = web.read()
xmldoc = minidom.parseString(document)

ff_DataSet = xmldoc.getElementsByTagName('ff:DataSet')[0]

ff_series = ff_DataSet.getElementsByTagName('ff:Series')[0]

for line in ff_series:
    price = line.getElementsByTagName('base:OBS_VALUE')[0].firstChild.data
    print(price)

网站上的XML代码:

-<Header> <ID>FFD</ID>
 <Test>false</Test> 
 <Name xml:lang="en">Federal Funds daily averages</Name> <Prepared>2013-05-08</Prepared>
 <Sender id="FRBNY"> <Name xml:lang="en">Federal Reserve Bank of New York</Name> 
<Contact>   
<Name xml:lang="en">Public Information Web Team</Name> <Email>ny.piwebteam@ny.frb.org</Email>  
</Contact> 
</Sender> 
<!--ReportingBegin></ReportingBegin-->
</Header> 
<ff:DataSet> -<ff:Series TIME_FORMAT="P1D" DISCLAIMER="G" FF_METHOD="D" DECIMALS="2" AVAILABILITY="A"> 
<ffbase:Key> 
<base:FREQ>D</base:FREQ> 
<base:RATE>FF</base:RATE>
<base:MATURITY>O</base:MATURITY> 
<ffbase:FF_SCOPE>D</ffbase:FF_SCOPE> 
</ffbase:Key> 
<ff:Obs OBS_CONF="F" OBS_STATUS="A">
<base:TIME_PERIOD>2013-05-07</base:TIME_PERIOD>
<base:OBS_VALUE>0.12</base:OBS_VALUE>
2个回答

8
如果你想继续使用xml.dom.minidom,请尝试以下方法...
from xml.dom import minidom
import urllib

url_str = 'http://www.newyorkfed.org/markets/omo/dmm/fftoXML.cfm?type=daily'
xml_str = urllib.urlopen(url_str).read()
xmldoc = minidom.parseString(xml_str)

obs_values = xmldoc.getElementsByTagName('base:OBS_VALUE')
# prints the first base:OBS_VALUE it finds
print obs_values[0].firstChild.nodeValue

# prints the second base:OBS_VALUE it finds
print obs_values[1].firstChild.nodeValue

# prints all base:OBS_VALUE in the XML document
for obs_val in obs_values:
    print obs_val.firstChild.nodeValue

然而,如果你想使用lxml,请使用underrun的解决方案。此外,您的原始代码存在一些错误。实际上,您试图解析文档变量,而文档变量是网址。您需要解析从网站返回的xml,这在您的示例中是get_web变量。

新增的信息非常感谢。 - Trying_hard
你为什么把url_str改成了xml_str? 应该是: xml_str = urllib.urlopen(url_str).read() - Moulde

3

看一下你的代码:

document = ('http://www.newyorkfed.org/markets/omo/dmm/fftoXML.cfm?type=daily''r')
web = urllib.urlopen(document)
get_web = web.read()
xmldoc = minidom.parseString(document)

我不确定你是否已经正确地记录了文档,除非你想要 http://www.newyorkfed.org/markets/omo/dmm/fftoXML.cfm?type=dailyr,因为这是你将得到的(在这种情况下,括号组和并排列出的字符串会自动连接)。

之后,你需要一些工作来创建get_web,但接下来你没有在下一行中使用它。相反,你试图解析你的document,它是url...

除此之外,我完全建议你使用ElementTree,最好是lxml的ElementTree (http://lxml.de/)。此外,lxml的etree解析器还可以接受一个类似文件的对象,可以是urllib对象。如果你做到了,在整理好你的文档之后,你可以这样做:

from lxml import etree
from io import StringIO
import urllib

url = 'http://www.newyorkfed.org/markets/omo/dmm/fftoXML.cfm?type=daily'
root = etree.parse(urllib.urlopen(url))

for obs in root.xpath('/ff:DataSet/ff:Series/ff:Obs'):
    price = obs.xpath('./base:OBS_VALUE').text
    print(price)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接