2013-05-08 9 views
8

Ich versuche, von einer Website zu analysieren. Ich stecke fest. Ich werde das XML unten zur Verfügung stellen. Es kommt von einer Webiste. Ich habe zwei Fragen. Was ist der beste Weg, XML von einer Website zu lesen, und dann habe ich Probleme, in das XML zu graben, um die Rate zu bekommen, die ich brauche.Python XML Parsing von der Website

Die Figur, die ich wieder brauchen, ist Basis: OBS_VALUE 0,12

Was ich habe, so weit:

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-Code von webiste:

-<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>[email protected]</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> 

Antwort

7

Wenn Sie mit xml.dom.minidom, versuchen, dies bleiben wollte ...

from xml.dom import minidom 
import urllib 

url_str = 'http://www.newyorkfed.org/markets/omo/dmm/fftoXML.cfm?type=daily' 
xml_str = urllib.urlopen(xml_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 doc 
for obs_val in obs_values: 
    print obs_val.firstChild.nodeValue 

jedoch Wenn Sie lxml verwenden möchten, verwenden Sie die Lösung für Unterlauf. Außerdem hatte Ihr ursprünglicher Code einige Fehler. Sie haben tatsächlich versucht, die Dokumentvariable zu analysieren, bei der es sich um die Webadresse handelt. Sie mussten das von der Website zurückgegebene XML analysieren, was in Ihrem Beispiel die Variable get_web ist.

+0

Vielen Dank. Ich muss Minidom verwenden. Danke für die Korrektur. –

+0

Die hinzugefügten Informationen werden geschätzt –

+0

Warum haben Sie url_str zu xml_str geändert? Sollte sein: xml_str = urllib.urlopen (url_str) .read() – Moulde

3

einen Blick auf den Code nehmen:

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) 

Ich bin mir nicht sicher, ob das Dokument korrekt ist, außer du willst http://www.newyorkfed.org/markets/omo/dmm/fftoXML.cfm?type=dailyr, denn das wirst du bekommen (die parens-Gruppe in diesem Fall und die nebeneinander aufgelisteten Strings werden automatisch verkettet).

Danach machen Sie etwas Arbeit, um get_web zu erstellen, aber dann verwenden Sie es nicht in der nächsten Zeile. Stattdessen versuchen Sie, Ihre document zu analysieren, die die URL ist ...

Darüber hinaus würde ich total vorschlagen, dass Sie ElementTree, vorzugsweise lxml's ElementTree (http://lxml.de/) verwenden. Auch der ltree-Parser von lxml nimmt ein dateiähnliches Objekt, das ein urllib-Objekt sein kann. Wenn ja, nachdem Sie den Rest Ihres doc Begradigung, können Sie dies tun:

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)