2013-05-08 24 views
8

Próbuję Parse ze strony internetowej. Utknąłem. Podam poniższy kod XML. Pochodzi z witryny internetowej. Mam dwa pytania. Jaki jest najlepszy sposób odczytywania xml ze strony internetowej, a następnie mam problem z wkopywaniem się w xml, aby uzyskać żądaną stawkę.Python XML parsing ze strony internetowej

Postać muszę z powrotem jest podstawowa: OBS_VALUE 0,12

Co mam tak daleko: kod

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 z 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> 

Odpowiedz

7

Jeśli chciał trzymać xml.dom.minidom, spróbuj tego ...

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 

jednak , jeśli chcesz używać lxml, użyj rozwiązania underrun. Twój oryginalny kod również zawierał błędy. W rzeczywistości próbujesz przeanalizować zmienną dokumentu, która była adresem internetowym. Musisz przeanalizować xml zwrócony z witryny, która w twoim przykładzie jest zmienną get_web.

+0

Dziękuję. Muszę użyć minidom. Dziękuję za poprawienie mnie. –

+0

Dodane informacje są mile widziane –

+0

Dlaczego zmieniliście url_str na xml_str? Powinno być: xml_str = urllib.urlopen (url_str) .read() – Moulde

3

Spójrz na kodzie:

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) 

Nie jestem pewien, czy masz poprawny dokument, chyba że chcesz http://www.newyorkfed.org/markets/omo/dmm/fftoXML.cfm?type=dailyr, ponieważ to właśnie otrzymasz (grupa parens w tym przypadku i łańcuchy wymienione obok siebie automatycznie łączą się).

Później wykonujesz trochę pracy, aby utworzyć get_web, ale nie użyjesz go w następnym wierszu. Zamiast tego próbujesz przetworzyć swój document, który jest adres URL ...

Poza tym, całkowicie sugerowałbym użyć ElementTree, najlepiej ElementTree elementu lxml (http://lxml.de/). Ponadto parser LDML-a pobiera obiekt plikopodobny, który może być obiektem urllib. Jeśli tak, po prostowaniu resztę swojego dokumentu, można to zrobić:

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) 
Powiązane problemy