2013-05-08 15 views
8

私はウェブサイトから解析しようとしています。ハマった。私は以下のXMLを提供します。それはwebisteから来ています。私には2つの質問があります。ウェブサイトからxmlを読み込む最良の方法は何ですか?次に、必要なレートを得るためにxmlを掘り下げるのに問題があります。WebサイトからのPython XML解析

私は戻って必要な数字が基本である:私はこれまで持って何OBS_VALUE 0.12

:webisteから

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

答えて

7

あなたはこれを試して、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(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 

しかし、 lxmlを使用する場合は、アンダーランのソリューションを使用します。また、元のコードにはいくつかのエラーがありました。実際にはWebアドレスであるドキュメント変数を解析しようとしていました。 Webサイトから返されたxmlを解析する必要があります。これは、例ではget_web変数です。

+0

ありがとうございます。私はminidomを使用する必要があります。訂正してくれてありがとう。 –

+0

追加された情報は高く評価されています –

+0

なぜ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(これはparensグループと隣り合って並んでいる文字列が自動的に連結されるため)が必要でない限り、正しい書類があるかどうかはわかりません。

その後、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) 
関連する問題