2013-05-08 38 views
8

Web sitesinden Ayrıştırmayı deniyorum. Sıkıştım. XML'yi aşağıda sağlayacağım. Bir webiste geliyor. İki sorum var. Bir web sitesinden xml okumanın en iyi yolu nedir ve sonra ihtiyacım olan hızı elde etmek için xml'ye kazma konusunda sorun yaşıyorum.Python XML Web sitesinden ayrıştırma XML

geri gereken rakam Taban geçerli: OBS_VALUE Ne var bugüne kadar

0.12:

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

cevap

7

Bunu deneyin xml.dom.minidom ile sopa isteseydim ...

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 

Ancak Eğer lxml kullanmak istiyorsanız, underrun'un çözümünü kullanın. Ayrıca, orijinal kodunuzda bazı hatalar vardı. Aslında, web adresi olan belge değişkenini ayrıştırmaya çalışıyordunuz. Örneğinizde get_web değişkeni olan web sitesinden döndürülen xml'yi ayrıştırmanız gerekiyordu.

+0

Teşekkür ederiz. Minidom kullanmalıyım. Düzeltme için teşekkürler. –

+0

Eklenen bilgi için teşekkür ederiz –

+0

Neden url_str - xml_str? Olması gereken: xml_str = urllib.urlopen (url_str) .read() – Moulde

3

Kodunuzdaki bir göz atın:

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 kodu webiste:

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'u istemediğiniz sürece doğru belgeye sahip olduğunuzdan emin değilim çünkü alacağınız şey budur (bu durumda parens grubu ve birbirinin yanında otomatik olarak sıralanmış dizeler).

Bundan sonra get_web oluşturmak için bazı işler yaparsınız, ancak sonra bir sonraki satırda kullanmazsınız. Bunun yerine, document olan document numaralı URL'yi ayrıştırmaya çalışın. Bunun ötesinde, ElementTree, tercihen lxml'in ElementTree (http://lxml.de/) kullanımını öneririm. Ayrıca, lxml'nin etree ayrıştırıcısı, bir urllib nesnesi olabilen dosya benzeri bir nesne alır. Eğer olsaydı, dokümanınızdan kalanını düzeltiyorum sonra bu yapabilirdi:

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)