XPath

2008-11-13 14 views
23

के माध्यम से पार्स एचटीएमएल। नेट में, मुझे यह महान लाइब्रेरी मिली, HtmlAgilityPack जो आपको XPath का उपयोग करके आसानी से गैर-गठित HTML को पार्स करने की अनुमति देता है। मैंने इसे अपने .NET साइटों में कुछ वर्षों तक उपयोग किया है, लेकिन मुझे अपने पायथन, रूबी और अन्य परियोजनाओं के लिए और अधिक दर्दनाक पुस्तकालयों के लिए बसना पड़ा है। क्या किसी को अन्य भाषाओं के लिए समान पुस्तकालयों के बारे में पता है?XPath

उत्तर

6

अजगर में, ElementTidy टैग सूप पार्स करके एक तत्व पेड़ है, जो XPath का उपयोग कर क्वेरी करने की अनुमति देता है पैदा करता है:

>>> from elementtidy.TidyHTMLTreeBuilder import TidyHTMLTreeBuilder as TB 
>>> tb = TB() 
>>> tb.feed("<p>Hello world") 
>>> e= tb.close() 
>>> e.find(".//{http://www.w3.org/1999/xhtml}p") 
<Element {http://www.w3.org/1999/xhtml}p at 264eb8> 
+1

आप पाइथन के लिए अब lxml पर विचार करना चाहेंगे –

+8

** खतरे!** इसके बजाय lxml के लिए सुंदर सूप पार्सर का उपयोग करें क्योंकि एलिमेंटिडी उन नामस्थानों पर चकित होगी जिन्हें घोषित नहीं किया गया है। मैने कठिनाइयों का सामना कर सीखा! –

5

BeautifulSoup स्वच्छ तरीके से गन्दा HTML से निपटने के लिए एक अच्छी पायथन लाइब्रेरी है।

+13

BeautifulSoup xpath :) – dzen

3

ऐसा लगता है कि प्रश्न को अधिक सटीक रूप से कहा जा सकता है "HTML को XML में कैसे परिवर्तित करें ताकि XPath अभिव्यक्तियों का मूल्यांकन" के खिलाफ किया जा सके।

यहाँ दो अच्छा उपकरण हैं: - आधारित उपकरण, John Cowan द्वारा विकसित

  1. TagSoup, एक खुला स्रोत कार्यक्रम, एक जावा और SAX है। यह जावा में लिखा गया एक एसएक्स-अनुपालन पार्सर है, जो अच्छी तरह से गठित या वैध एक्सएमएल को पार्स करने के बजाय, जंगली में पाए जाने वाले HTML को पार्स करता है: गरीब, बुरा और क्रूर, हालांकि अक्सर बहुत कम से कम। टैग्सपॉप उन लोगों के लिए डिज़ाइन किया गया है जिन्हें तर्कसंगत एप्लिकेशन डिज़ाइन के कुछ समानता का उपयोग करके इस सामग्री को संसाधित करना है। एक SAX इंटरफ़ेस प्रदान करके, यह मानक XML उपकरण को सबसे खराब HTML पर भी लागू करने की अनुमति देता है। टैग सूप में एक कमांड लाइन प्रोसेसर भी शामिल है जो एचटीएमएल फाइलें पढ़ता है और या तो स्वच्छ एचटीएमएल या अच्छी तरह से गठित एक्सएमएल उत्पन्न कर सकता है जो एक्सएचटीएमएल के करीब अनुमान है।
    Taggle टैगसोप का एक वाणिज्यिक सी ++ पोर्ट है।

  2. SgmlReader माइक्रोसॉफ्ट के Chris Lovett द्वारा विकसित एक उपकरण है।
    SgmlReader किसी भी SGML दस्तावेज़ (HTML के लिए समर्थन में निर्मित सहित) पर XmlReader API है। एक कमांड लाइन उपयोगिता भी प्रदान की जाती है जो अच्छी तरह से बनाए गए XML परिणाम का उत्पादन करती है। SgmlReader.zip

1

एक उत्कृष्ट उपलब्धि the pure XSLT 2.0 Parser of HTMLDavid Carlisle ने लिखा है:
स्टैंडअलोन निष्पादन योग्य और पूर्ण स्रोत कोड सहित ज़िप फ़ाइल डाउनलोड करें।

अपना कोड पढ़ना हमारे सभी के लिए एक महान सीखने का अभ्यास होगा।

वर्णन से:

"घ: htmlparse (स्ट्रिंग)
  घ: htmlparse (स्ट्रिंग, नाम स्थान, एचटीएमएल मोड)

    एक तर्क प्रपत्र के बराबर है)
    घ: htmlparse (स्ट्रिंग, 'http://ww.w3.org/1999/xhtml', सच()))

    HTML और/या XML के रूप में स्ट्रिंग कुछ इनबिल्ट heuristics करने के लिए) का उपयोग करपार्स करता है     नियंत्रण तत्वों के उद्घाटन और समापन पर निहित है।

    यह HTML DTD का पूरा ज्ञान नहीं है लेकिन
    खाली तत्वों और इकाई परिभाषाओं की पूरी सूची की पूरी सूची है।एचटीएमएल इकाइयों, और
    दशमलव और हेक्स चरित्र संदर्भ सभी स्वीकार किए जाते हैं। नोट एचटीएमएल-इकाइयों
    एचटीएमएल मोड = झूठी() के बावजूद भी पहचाने जाते हैं।

    तत्व नाम लोवरकेस कर रहे हैं (यदि एचटीएमएल मोड सच() है) और
    नाम स्थान नाम स्थान पैरामीटर (जो हो सकता है "" के द्वारा निर्दिष्ट में रखा निरूपित करने के लिए
    कोई नाम स्थान जब तक इनपुट नाम स्थान घोषणाओं explict गया है,
    जो मामले इन सम्मानित किया जाएगा में।

    विशेषता नाम लोवरकेस रहे हैं एचटीएमएल मोड = सच()
"

एक और विस्तृत विवरण here पढ़ें।

आशा है कि इससे मदद मिलेगी।

चीयर्स,

Dimitre Novatchev।

2

रुबी के लिए, मैं अत्यधिक हिप्रिकॉट की सलाह देता हूं कि जेबी इवान ने बताया। यदि आप तेजी से libxml- आधारित प्रतियोगी की तलाश में हैं, तो नोकोगिरी (http://tenderlovemaking.com/2008/10/30/nokogiri-is-released/ देखें) बहुत अच्छा है (यह XPath और CSS दोनों खोजों जैसे Hpricot का समर्थन करता है लेकिन तेज़ है)। एक मूल wiki और कुछ benchmarks है।

+1

का उपयोग नहीं करता मैं अत्यधिक की सलाह देते हैं [Nokogiri] (http: // nokogiri। संगठन) इन दिनों। यह सब कुछ है Hpricot था और अधिक। –

1

एक्सएमएल के लिए मुफ्त सी कार्यान्वयन है जिसे libxml2 कहा जाता है जिसमें XPath के लिए कुछ एपीआई बिट्स हैं जिन्हें मैंने बड़ी सफलता के साथ उपयोग किया है जिसे आप HTML को लोड होने वाले दस्तावेज़ के रूप में निर्दिष्ट कर सकते हैं। यह मेरे लिए सही HTML दस्तावेज़ों से कम कुछ के लिए काम किया था ..

अधिकांश भाग के लिए, XPath सबसे उपयोगी है जब इनबाउंड HTML को ठीक से कोड किया गया है और इसे 'xml दस्तावेज़ की तरह' पढ़ा जा सकता है। आप एचटीएमएल दस्तावेजों की सफाई के लिए इस उद्देश्य के लिए विशिष्ट उपयोगिता का उपयोग करने पर विचार करना चाह सकते हैं। यहां एक उदाहरण दिया गया है: http://tidy.sourceforge.net/

जहां तक ​​ये XPath टूल जाते हैं- आपको शायद यह पता चल जाएगा कि अधिकांश कार्यान्वयन वास्तव में पूर्व-मौजूदा सी या सी ++ पुस्तकालयों जैसे libxml2 पर आधारित हैं।

41

मैं हैरान हूँ वहाँ lxml की एक एकल उल्लेख नहीं है। यह तेजस्वी तेज है और किसी भी पर्यावरण में काम करेगा जो सीपीथॉन पुस्तकालयों को अनुमति देता है।

यहां you can parse HTML via XPATH using lxml है।

>>> from lxml import etree 
>>> doc = '<foo><bar></bar></foo>' 
>>> tree = etree.HTML(doc) 

>>> r = tree.xpath('/foo/bar') 
>>> len(r) 
1 
>>> r[0].tag 
'bar' 

>>> r = tree.xpath('bar') 
>>> r[0].tag 
'bar' 
+1

अरे, यह एक पुराना सवाल है: -/ –

+8

इसका मतलब यह नहीं है कि आप इसका उत्तर दे सकते हैं। आदर्श रूप से, सबसे अच्छा जवाब बुलबुला बहुत लंबे समय के बाद भी। वैसे, आपका उत्तर केवल एक्सएमएल, एक्सएमएल नहीं है। आपको 'HTMLParser' उदाहरण शामिल करना चाहिए। – phihag

+1

फिहाग: इसे ठीक किया गया। एचटीएमएल के साथ अब भी काम करता है, जब तक दस्तावेज़ में वह पाठ होता है जिसे हम पार्स करना चाहते हैं। –

5

सबसे स्थिर परिणाम जो मैं lxml.html के soupparser का उपयोग कर रहा था। तुम्हें पता है, अजगर-lxml और अजगर-BeautifulSoup इंस्टॉल करने होंगे तो आप निम्न कर सकते हैं: