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

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

0
ro fr bn
मुझे यह बेवकूफ़ संदेह है कि इस सवाल का जवाब अब थोड़ा सा है।
जोड़ा लेखक Warren P, स्रोत
@ ग्रिंगो-स्वीवे का उत्तर एक अच्छा अपडेट की तरह दिखता है। stackoverflow.com/a/13504511/1450294
जोड़ा लेखक Michael Scheper, स्रोत

11 उत्तर

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

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

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

PyXML works well.

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

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

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

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

0
जोड़ा

lxml पैकेज xpath का समर्थन करता है। ऐसा लगता है कि यह बहुत अच्छी तरह से काम करता है, हालांकि मुझे स्वयं :: धुरी के साथ कुछ परेशानी हुई है। अमारा भी है, लेकिन मैंने इसे व्यक्तिगत रूप से उपयोग नहीं किया है।

0
जोड़ा
अमारा का बहुत अच्छा है, और किसी को हमेशा xpath की आवश्यकता नहीं होती है।
जोड़ा लेखक gatoatigrado, स्रोत
lxml निश्चित रूप से पाइथन के साथ आसान एक्सएमएल काम आसान बनाता है।
जोड़ा लेखक Jon W, स्रोत
+1 जैसा कि यह पीपीपीआई पर है। pip instal lxml के रूप में सरल
जोड़ा लेखक Michal, स्रोत

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

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
0
जोड़ा
जब मैं पीईएक्सएमएल कोड आज़माता हूं, तो मुझे importError: से xml.dom.ext.reader आयात Sax2
जोड़ा लेखक Aminah Nuraini, स्रोत

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

>>> from parsel import Selector
>>> sel = Selector(text=u"""<html>
        <body>
            

Hello, Parsel!

            
>>
>>> sel.css('h1::text').extract_first()
'Hello, Parsel!'
>>> sel.xpath('//h1/text()').extract_first()
'Hello, Parsel!'
0
जोड़ा
पाठ प्राप्त करने के लिए, यह //li/a/text() जैसा होना चाहिए
जोड़ा लेखक eLRuLL, स्रोत
अगर मैं "लिंक 1" और "लिंक 2" प्राप्त करना चाहता हूं तो मेरा एक्सपैथ कैसा दिखना चाहिए?
जोड़ा लेखक weefwefwqg3, स्रोत

यहां एक एलएक्सएमएल विज्ञापन की तरह लगता है। ;) 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
0
जोड़ा

Another library is 4Suite: http://sourceforge.net/projects/foursuite/

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

0
जोड़ा

एक और विकल्प py-dom-xpath है, यह minidom के साथ निर्बाध रूप से काम करता है और है शुद्ध पायथन तो एपेंगेन पर काम करता है।

import xpath
xpath.find('//item', doc)
0
जोड़ा
यदि आप पहले से ही मिनीडोम के साथ काम कर रहे हैं तो lxml और libxml2 से अधिक आसान है। खूबसूरती से काम करता है और अधिक "पायथनिक" है। संदर्भ में संदर्भ फ़ंक्शन में आपको एक नया खोज संदर्भ के रूप में एक और xpath परिणाम का उपयोग करने दें।
जोड़ा लेखक Ben, स्रोत
मैं भी पाई-डोम-एक्सपैथ का उपयोग कर रहा हूं क्योंकि मैं एक प्लगइन लिखता हूं, क्योंकि यह शुद्ध पायथन है। लेकिन मुझे नहीं लगता कि यह अब और बनाए रखा गया है, और इस बग से अवगत रहें ("उस तत्व का उपयोग नहीं कर सकता जिसका नाम 'टेक्स्ट' है): code.google.com/p/py-dom-xpath/issues/detail?id=8
जोड़ा लेखक Jon Coombs, स्रोत

libxml2 has a number of advantages:

  1. Compliance to the spec
  2. Active development and a community participation
  3. Speed. This is really a python wrapper around a C implementation.
  4. Ubiquity. The libxml2 library is pervasive and thus well tested.

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

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

यदि आप सरल पथ चयन कर रहे हैं, तो ElementTree (जो पायथन 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()

एलिमेंट ट्री XPath उपयोग का नमूना


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

0
जोड़ा
ओएसएक्स पर पायथन 2.7.10 का उपयोग करके मुझे एलिमेंट ट्री को xml.etree.ElementTree आयात ElementTree से आयात करना था
जोड़ा लेखक Ben Page, स्रोत

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

0
जोड़ा

You can use the simple soupparser from lxml

उदाहरण:

from lxml.html.soupparser import fromstring

tree = fromstring("Find me!")
print tree.xpath("//a/text()")
0
जोड़ा
Soupparser का उपयोग कर क्या अंतर करता है?
जोड़ा लेखक Padraic Cunningham, स्रोत
यह सिर्फ एक विकल्प है
जोड़ा लेखक Aminah Nuraini, स्रोत