पायथन में Xpath का उपयोग कैसे करें?


224

वे पुस्तकालय कौन सी हैं जो Xpath का समर्थन करते हैं? क्या पूर्ण कार्यान्वयन है? पुस्तकालय का उपयोग कैसे किया जाता है? इसकी वेबसाइट कहाँ है?


4
मुझे यह संदेह है कि इस सवाल के जवाब अब थोड़ा बासी हैं।
वारेन पी

4
@ ग्रिंगो-सुवे द्वारा जवाब एक अच्छा अद्यतन की तरह दिखता है। stackoverflow.com/a/13504511/1450294
माइकल स्हीपर

स्क्रेपी XPath चयनकर्ताओं प्रदान करता है ।
CS95

जैसा कि @WarrenP कहता है, यहां अधिकांश उत्तर बहुत पुराना पुराना पायथन-2. x हैं, जो वास्तव में पुराना है। हो सकता है कि इस सवाल को python-2.x
smci

जवाबों:


129

libxml2 के कई फायदे हैं:

  1. युक्ति का अनुपालन
  2. सक्रिय विकास और एक सामुदायिक भागीदारी
  3. स्पीड। यह वास्तव में एक सी कार्यान्वयन के आसपास एक अजगर आवरण है।
  4. सर्वव्यापकता। Libxml2 लाइब्रेरी व्यापक है और इस तरह अच्छी तरह से परखी जाती है।

डाउनसाइड में शामिल हैं:

  1. युक्ति का अनुपालन । यह सख्त है। अन्य पुस्तकालयों में डिफ़ॉल्ट नेमस्पेस हैंडलिंग जैसी चीजें आसान हैं।
  2. देशी कोड का उपयोग। यह आपके आवेदन कैसे वितरित / तैनात किया जाता है, इसके आधार पर दर्द हो सकता है। RPM उपलब्ध हैं जो इस दर्द को कम करते हैं।
  3. मैनुअल संसाधन हैंडलिंग। कॉल के नीचे दिए गए नमूने में नोट करें फ्रीडॉक () और xpathFreeContext () के लिए। यह बहुत पाइथोनिक नहीं है।

यदि आप सरल पथ चयन कर रहे हैं, तो एलीमेंटट्री (जो पायथन 2.5 में शामिल है) के साथ रहें । यदि आपको पूर्ण युक्ति अनुपालन या कच्ची गति की आवश्यकता है और मूल कोड के वितरण के साथ सामना कर सकते हैं, तो libxml2 पर जाएं।

Libxml2 XPath उपयोग का नमूना


import libxml2

doc = libxml2.parseFile("tst.xml")
ctxt = doc.xpathNewContext()
res = ctxt.xpathEval("//*")
if len(res) != 2:
    print "xpath query: wrong node set size"
    sys.exit(1)
if res[0].name != "doc" or res[1].name != "foo":
    print "xpath query: wrong node set value"
    sys.exit(1)
doc.freeDoc()
ctxt.xpathFreeContext()

ElementTree XPath उपयोग का नमूना


from elementtree.ElementTree import ElementTree
mydoc = ElementTree(file='tst.xml')
for e in mydoc.findall('/foo/bar'):
    print e.get('title').text


8
osx पर python 2.7.10 का उपयोग करते हुए मुझे ElementTree को आयात करना पड़ाfrom xml.etree.ElementTree import ElementTree
बेन पेज

क्योंकि यह एक C रैपर है जिसे आपको AWS
लैंबडा में

85

Lxml पैकेज का समर्थन करता है XPath। यह बहुत अच्छी तरह से काम करने लगता है, हालांकि मुझे स्व :: अक्ष के साथ कुछ परेशानी हुई है। अमारा भी है , लेकिन मैंने इसे व्यक्तिगत रूप से इस्तेमाल नहीं किया है।


1
अमारा काफ़ी अच्छा है, और एक को हमेशा xpath की आवश्यकता नहीं होती है।
gatoatigrado

कृपया xxath का उपयोग lxml के साथ करने के बारे में कुछ बुनियादी विवरण जोड़ें।
jpmc26

56

यहाँ एक lxml विज्ञापन की तरह लगता है। ;) ElementTree को std लाइब्रेरी में शामिल किया गया है। 2.6 से कम और इसके xpath से काफी कमजोर है, लेकिन 2.7+ में बहुत सुधार हुआ है :

import xml.etree.ElementTree as ET
root = ET.parse(filename)
result = ''

for elem in root.findall('.//child/grandchild'):
    # How to make decisions based on attributes even in 2.6:
    if elem.attrib.get('name') == 'foo':
        result = elem.text
        break

39

LXML का उपयोग करें। LXML ने libxml2 और libxslt की पूरी शक्ति का उपयोग किया है, लेकिन उन "पायथन" बाइंडिंग को पायथन बाइंडिंग की तुलना में अधिक लपेटता है जो उन पुस्तकालयों के मूल निवासी हैं। जैसे, इसे पूर्ण XPath 1.0 कार्यान्वयन मिलता है। Native ElemenTree XPath के सीमित उपसमूह का समर्थन करता है, हालाँकि यह आपकी आवश्यकताओं के लिए पर्याप्त हो सकता है।


29

एक अन्य विकल्प पीआईई -डोम- एक्सपैथ है, यह मिनिडोम के साथ मूल रूप से काम करता है और शुद्ध पायथन है इसलिए एपेंगिन पर काम करता है।

import xpath
xpath.find('//item', doc)

2
यदि आप पहले से ही मिनीडोम के साथ काम कर रहे हैं तो lxml और libxml2 की तुलना में आसान है। खूबसूरती से काम करता है और अधिक "पायथोनिक" है। contextमें findसमारोह आप एक नई खोज के संदर्भ के रूप में एक और xpath परिणाम का उपयोग करते हैं।
बेन

3
मैं भी py-dom-xpath का उपयोग कर रहा हूं क्योंकि मैं एक प्लगइन लिखता हूं, क्योंकि यह शुद्ध अजगर है। लेकिन मुझे नहीं लगता कि यह अब भी बनाए रखा गया है, और इस बग के बारे में पता होना चाहिए ("एक तत्व जिसका नाम 'पाठ है" तक नहीं पहुंच सकता है): code.google.com/p/py-dom-xpath/issues/detail?id = 8
जॉन कॉम्ब्स 20

py-dom-xpath का मानना ​​है कि 2010 में साल पहले mothballed किया गया था , कृपया इसे कम से कम अपने उत्तर में संपादित करें।
10

14

आप उपयोग कर सकते हैं:

PyXML :

from xml.dom.ext.reader import Sax2
from xml import xpath
doc = Sax2.FromXmlFile('foo.xml').documentElement
for url in xpath.Evaluate('//@Url', doc):
  print url.value

libxml2 :

import libxml2
doc = libxml2.parseFile('foo.xml')
for url in doc.xpathEval('//@Url'):
  print url.content

जब मैं PyXML कोड का प्रयास करें, मुझे मिल गया ImportError: No module named extसेfrom xml.dom.ext.reader import Sax2
Aminah Nuraini

9

एलीमेंट्री का नवीनतम संस्करण एक्सपीथ को बहुत अच्छी तरह से समर्थन करता है। XPath विशेषज्ञ नहीं होने के कारण मैं यह सुनिश्चित करने के लिए नहीं कह सकता कि यदि कार्यान्वयन पूर्ण है, लेकिन पायथन में काम करने के दौरान इसने मेरी अधिकांश जरूरतों को पूरा किया है। मैंने lxml और PyXML का भी उपयोग किया है और मुझे यह बहुत अच्छा लगता है क्योंकि यह एक मानक मॉड्यूल है।

नोट: मैंने तब से lxml पाया है और मेरे लिए यह निश्चित रूप से पायथन के लिए सबसे अच्छा एक्सएमएल काम है। यह XPath अच्छी तरह से करता है (हालांकि फिर से शायद पूर्ण कार्यान्वयन नहीं)।


7
ElementTree का XPath सपोर्ट वर्तमान में न्यूनतम है। कार्यक्षमता में भारी अंतराल छेद हैं, जैसे कि विशेषता चयनकर्ताओं की कमी, कोई गैर-डिफ़ॉल्ट कुल्हाड़ियों, कोई बच्चा अनुक्रमण नहीं, आदि। संस्करण 1.3 (अल्फा में) इनमें से कुछ विशेषताएं जोड़ता है, लेकिन यह अभी भी एक आंशिक रूप से आंशिक कार्यान्वयन है।
जेम्स ब्रैडी

8

आप soupparserसे सरल का उपयोग कर सकते हैंlxml

उदाहरण:

from lxml.html.soupparser import fromstring

tree = fromstring("<a>Find me!</a>")
print tree.xpath("//a/text()")

सूपपर का उपयोग करने से क्या फर्क पड़ता है?
पडराइक कनिंघम 23

यह सिर्फ एक विकल्प है
अमीनाह नुरैनी

7

यदि आप XPATH की शक्ति को किसी भी बिंदु पर CSS का उपयोग करने की क्षमता के साथ संयुक्त करना चाहते हैं, जिसका आप उपयोग कर सकते हैं parsel:

>>> from parsel import Selector
>>> sel = Selector(text=u"""<html>
        <body>
            <h1>Hello, Parsel!</h1>
            <ul>
                <li><a href="http://example.com">Link 1</a></li>
                <li><a href="http://scrapy.org">Link 2</a></li>
            </ul
        </body>
        </html>""")
>>>
>>> sel.css('h1::text').extract_first()
'Hello, Parsel!'
>>> sel.xpath('//h1/text()').extract_first()
'Hello, Parsel!'

अगर मैं "लिंक 1" और "लिंक 2" प्राप्त करना चाहता हूं तो मेरे Xpath को कैसा दिखना चाहिए?
weefwefwqg3

1
पाठ प्राप्त करने के लिए, यह कुछ इस तरह होना चाहिए//li/a/text()
eLRuLL

4

एक अन्य पुस्तकालय 4 साइट है: http://sourceforge.net/projects/foursuite/

मुझे नहीं पता कि यह कैसे युक्ति-संगत है। लेकिन इसने मेरे इस्तेमाल के लिए बहुत अच्छा काम किया है। यह परित्यक्त दिखता है।


3

PyXML अच्छा काम करता है।

आपने यह नहीं कहा कि आप किस प्लेटफ़ॉर्म का उपयोग कर रहे हैं, हालाँकि यदि आप उबंटू में हैं तो आप इसे प्राप्त कर सकते हैं sudo apt-get install python-xml। मुझे यकीन है कि अन्य लिनक्स डिस्ट्रोस के पास भी है।

यदि आप एक मैक पर हैं, तो xpath पहले से इंस्टॉल है, लेकिन तुरंत पहुंच योग्य नहीं है। PY_USE_XMLPLUSXml.xpath को आयात करने से पहले आप अपने वातावरण में सेट कर सकते हैं या इसे पायथन तरीके से कर सकते हैं:

if sys.platform.startswith('darwin'):
    os.environ['PY_USE_XMLPLUS'] = '1'

सबसे खराब स्थिति में आपको इसे स्वयं बनाना पड़ सकता है। यह पैकेज अब बनाए नहीं रखा गया है, लेकिन फिर भी ठीक बनाता है और आधुनिक 2.x पायथन के साथ काम करता है। बेसिक डॉक्स यहां हैं


0

यदि आप इसे html के लिए आवश्यक करने जा रहे हैं :

import lxml.html as html
root  = html.fromstring(string)
root.xpath('//meta')
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.