2013-05-08 4 views
8

मैं किसी वेबसाइट से पार्स करने की कोशिश कर रहा हूं। मैं फँस गया हूँ। मैं नीचे एक्सएमएल प्रदान करूंगा। यह एक वेबिस्ट से आ रहा है। मेरे पास दो प्रश्न हैं। किसी वेबसाइट से एक्सएमएल पढ़ने का सबसे अच्छा तरीका क्या है, और फिर मुझे जिस दर की आवश्यकता है, उसे पाने के लिए मुझे एक्सएमएल में खुदाई करने में परेशानी हो रही है।वेबसाइट से पाइथन एक्सएमएल पार्सिंग

आंकड़ा मैं वापस की जरूरत बेस है: 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 

हालांकि , यदि आप एलएक्सएमएल का उपयोग करना चाहते हैं, तो अंडर्रुन के समाधान का उपयोग करें। साथ ही, आपके मूल कोड में कुछ त्रुटियां थीं। आप वास्तव में दस्तावेज़ चर का विश्लेषण करने का प्रयास कर रहे थे, जो वेब पता था। आपको वेबसाइट से लौटाए गए एक्सएमएल को पार्स करने की आवश्यकता है, जो आपके उदाहरण में get_web चर है।

+0

धन्यवाद। मुझे मिनीडॉम का उपयोग करने की ज़रूरत है। सुधारों के लिए धन्यवाद। –

+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 नहीं चाहते हैं क्योंकि यह वही है जो आपको मिलेगा (इस मामले में अभिभावक समूह और एक दूसरे के बगल में सूचीबद्ध तार स्वचालित रूप से संयोजित होते हैं)।

इसके बाद आप get_web बनाने के लिए कुछ काम करते हैं लेकिन फिर आप इसे अगली पंक्ति में उपयोग नहीं करते हैं। इसके बजाय यदि आप अपने document जो यूआरएल है ...

इसके अलावा पार्स करने के लिए कोशिश मैं पूरी तरह आप ElementTree, अधिमानतः lxml के ElementTree (http://lxml.de/) का उपयोग सुझाव है। इसके अलावा, lxml का एट्री पार्सर फ़ाइल-जैसी ऑब्जेक्ट लेता है जो एक 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) 
संबंधित मुद्दे