2012-02-23 18 views
5

Hialxml - कठिनाई पार्स करने stackexchange आरएसएस

मैं कर रहा हूँ समस्याओं अजगर में stackexchange से RSS फ़ीड को पार्स फ़ीड। जब मैं सारांश नोड्स प्राप्त करने का प्रयास करता हूं, तो एक खाली सूची वापस आती है

मैं इसे हल करने का प्रयास कर रहा हूं, लेकिन मेरे सिर को चारों ओर नहीं मिल सकता है।

क्या कोई मदद कर सकता है? धन्यवाद एक

In [3o]: import lxml.etree, urllib2

In [31]: url_cooking = 'http://cooking.stackexchange.com/feeds' 

In [32]: cooking_content = urllib2.urlopen(url_cooking) 

In [33]: cooking_parsed = lxml.etree.parse(cooking_content) 

In [34]: cooking_texts = cooking_parsed.xpath('.//feed/entry/summary') 

In [35]: cooking_texts 
Out[35]: [] 

उत्तर

9

आप की खोज की इन दो संस्करणों

import lxml.html, lxml.etree 

url_cooking = 'http://cooking.stackexchange.com/feeds' 

#lxml.etree version 
data = lxml.etree.parse(url_cooking) 
summary_nodes = data.xpath('.//feed/entry/summary') 
print('Found ' + str(len(summary_nodes)) + ' summary nodes') 

#lxml.html version 
data = lxml.html.parse(url_cooking) 
summary_nodes = data.xpath('.//feed/entry/summary') 
print('Found ' + str(len(summary_nodes)) + ' summary nodes') 

पर एक नजर डालें, दूसरे संस्करण कोई नोड्स दिखाए, लेकिन lxml.html संस्करण ठीक काम करता है। etree संस्करण काम नहीं कर रहा है क्योंकि यह नामस्थानों की अपेक्षा कर रहा है और html संस्करण काम कर रहा है क्योंकि यह नामस्थानों को अनदेखा करता है। http://lxml.de/lxmlhtml.html नीचे भाग रास्ता, यह कहता है "एचटीएमएल पार्सर विशेष रूप से नेमस्पेस और कुछ अन्य एक्सएमएलआईएमएस को अनदेखा करता है।"

नोट करें जब आप एट्री संस्करण (print(data.getroot())) के रूट नोड को मुद्रित करते हैं, तो आपको <Element {http://www.w3.org/2005/Atom}feed at 0x22d1620> जैसे कुछ मिलता है। इसका मतलब है कि यह http://www.w3.org/2005/Atom के नामस्थान के साथ फ़ीड तत्व है। इट्री कोड का एक सही संस्करण यहां दिया गया है।

import lxml.html, lxml.etree 

url_cooking = 'http://cooking.stackexchange.com/feeds' 

ns = 'http://www.w3.org/2005/Atom' 
ns_map = {'ns': ns} 

data = lxml.etree.parse(url_cooking) 
summary_nodes = data.xpath('//ns:feed/ns:entry/ns:summary', namespaces=ns_map) 
print('Found ' + str(len(summary_nodes)) + ' summary nodes') 
+0

'data.xpath ('// एनएस: फ़ीड/एनएस: प्रवेश/एनएस: सारांश', नामस्थान = { 'एनएस': 'http: //www.w3.org/2005/Atom '}) ' – reclosedev

+0

गा, कोई आश्चर्य नहीं! ऐसा लगता है कि एपीआई ने किसी नाम पर 'नेमस्पेस' कीवर्ड का नाम बदल दिया है। कामकाजी कोड के साथ अपना नमूना अद्यतन कर रहा है। – gfortune

+0

आपको बहुत अधिक उत्साह का धन्यवाद। मैं इसे पार्स करने के लिए आगे बढ़ने से पहले रूट की जांच करना शुरू कर दूंगा। – MrCastro

6

समस्या नामस्थान है।

भागो इस:

cooking_parsed.getroot().tag 

और तुम उस तत्व के रूप में

{http://www.w3.org/2005/Atom}feed 

इसी प्रकार यदि आप फ़ीड प्रविष्टियों से एक पर नेविगेट namespaced है देखेंगे।

इसका मतलब यह है lxml में सही xpath है:

print cooking_parsed.xpath(
    "//a:feed/a:entry", 
    namespaces={ 'a':'http://www.w3.org/2005/Atom' }) 
+0

किसी भी तरह मुझे संदेह है कि यह जवाब मेरे लिए आपके लिए आसान था। ;) धीरे-धीरे अपना जवाब बंपिंग करें और मेरे द्वारा किए गए किसी भी त्रुटि को इंगित करने के लिए स्वतंत्र महसूस करें। – gfortune

संबंधित मुद्दे