10

Web サイトから解析しようとしています。ハマった。以下に XML を提供します。ウェブサイトから来ています。2 つの質問があります。Web サイトから 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>
4

2 に答える 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 を使用する場合は、アンダーランのソリューションを使用してください。また、元のコードにはいくつかのエラーがありました。実際には、Web アドレスである document 変数を解析しようとしていました。Web サイトから返された xml を解析する必要がありました。例では get_web 変数です。

于 2013-05-08T13:52:21.803 に答える
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)
于 2013-05-08T13:39:54.750 に答える