Πώς να χρησιμοποιήσετε Xpath στην Python;

ψήφοι
190

Τι είναι η βιβλιοθήκη; Είναι μια πλήρης εφαρμογή εκεί; Πώς χρησιμοποιείται το η βιβλιοθήκη; Πού είναι η ιστοσελίδα του;

Δημοσιεύθηκε 12/08/2008 στις 10:28
πηγή χρήστη
Σε άλλες γλώσσες...                            


12 απαντήσεις

ψήφοι
80

Το πακέτο lxml υποστηρίζει xpath. Φαίνεται να λειτουργεί αρκετά καλά, αν και είχα κάποια προβλήματα με τον εαυτό :: άξονα. Υπάρχει, επίσης, Amara , αλλά δεν το έχω χρησιμοποιήσει προσωπικά.

Απαντήθηκε 12/08/2008 στις 10:40
πηγή χρήστη

ψήφοι
3

PyXML λειτουργεί καλά.

Δεν είπατε τι πλατφόρμα που χρησιμοποιείτε, ωστόσο, εάν είστε στο Ubuntu μπορείτε να το πάρετε μαζί sudo apt-get install python-xml. Είμαι βέβαιος ότι άλλες διανομές Linux που έχουν ως καλά.

Αν είστε σε ένα Mac, XPath είναι ήδη εγκατεστημένο αλλά δεν είναι άμεσα προσβάσιμες. Μπορείτε να ρυθμίσετε PY_USE_XMLPLUSτο περιβάλλον σας ή να κάνετε τον τρόπο Python πριν από την εισαγωγή xml.xpath:

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

Στη χειρότερη περίπτωση μπορεί να χρειαστεί να το φτιάξετε μόνοι σας. Αυτό το πακέτο δεν είναι πλέον διατηρηθεί, αλλά εξακολουθεί να χτίζει μια χαρά και λειτουργεί με σύγχρονα Pythons 2.x. Βασικές docs είναι εδώ .

Απαντήθηκε 12/08/2008 στις 18:34
πηγή χρήστη

ψήφοι
9

Η τελευταία έκδοση του elementtree υποστηρίζει XPath αρκετά καλά. Δεν είναι ένα XPath ειδικός δεν μπορώ να πω με βεβαιότητα αν η εφαρμογή είναι πλήρης, αλλά έχει ικανοποιήσει τις περισσότερες ανάγκες μου, όταν εργάζονται σε Python. Έχω επίσης να χρησιμοποιήσετε lxml και PyXML και θεωρώ etree ωραίο γιατί είναι μια τυπική λειτουργική μονάδα.

ΣΗΜΕΙΩΣΗ: Έχω αφού διαπιστώθηκε lxml και για μένα αυτό είναι σίγουρα το καλύτερο lib XML εκεί έξω για Python. Κάνει XPath ωραία καθώς (αν και πάλι ίσως όχι σε πλήρη εφαρμογή).

Απαντήθηκε 14/08/2008 στις 08:48
πηγή χρήστη

ψήφοι
115

libxml2 έχει μια σειρά από πλεονεκτήματα:

  1. Η συμμόρφωση προς το spec
  2. Ενεργή ανάπτυξη και τη συμμετοχή της κοινότητας
  3. Ταχύτητα. Αυτό είναι πραγματικά ένα python περιτύλιγμα γύρω από μια εφαρμογή C.
  4. Πανταχού παρουσία. Η βιβλιοθήκη libxml2 είναι διάχυτη και συνεπώς αρκετά δοκιμαστεί.

Μειονεκτήματα περιλαμβάνουν:

  1. Η συμμόρφωση προς το spec . Είναι αυστηρή. Τα πράγματα όπως το χειρισμό προεπιλογή namespace είναι πιο εύκολο σε άλλες βιβλιοθήκες.
  2. Η χρήση των εγγενή κώδικα. Αυτό μπορεί να είναι ένας πόνος, ανάλογα με το πώς η εφαρμογή σας διανέμεται / αναπτυχθεί. Στροφές είναι διαθέσιμα που διευκολύνει μερικές από αυτόν τον πόνο.
  3. Χειρωνακτική διακίνηση πόρων. Σημείωση του δείγματος κάτω από τις κλήσεις προς freedoc () και xpathFreeContext (). Αυτό δεν είναι πολύ Pythonic.

Αν κάνετε απλή επιλογή διαδρομής, ραβδί με ElementTree (που περιλαμβάνεται στην Python 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

Απαντήθηκε 26/08/2008 στις 12:06
πηγή χρήστη

ψήφοι
38

Χρησιμοποιήστε LXML. LXML χρησιμοποιεί την πλήρη ισχύ του libxml2 και libxslt, αλλά να τους τυλίγει σε περισσότερες συνδέσεις «Pythonic» από τις δέστρες Python που είναι εγγενείς σε αυτές τις βιβλιοθήκες. Ως εκ τούτου, παίρνει την πλήρη εφαρμογή XPath 1.0. Native ElemenTree υποστηρίζει ένα περιορισμένο υποσύνολο των XPath, αν και μπορεί να είναι αρκετά καλό για τις ανάγκες σας.

Απαντήθηκε 13/11/2009 στις 22:11
πηγή χρήστη

ψήφοι
27

Μια άλλη επιλογή είναι py-dom-XPath , λειτουργεί άψογα με minidom και είναι καθαρή Python, έτσι λειτουργεί σε AppEngine.

import xpath
xpath.find('//item', doc)
Απαντήθηκε 23/01/2010 στις 08:30
πηγή χρήστη

ψήφοι
4

Μια άλλη βιβλιοθήκη είναι 4Suite: http://sourceforge.net/projects/foursuite/

Δεν ξέρω πώς spec συμβατό είναι. Αλλά έχει λειτουργήσει πολύ καλά για δική μου χρήση. Φαίνεται εγκαταλειφθεί.

Απαντήθηκε 23/08/2010 στις 11:57
πηγή χρήστη

ψήφοι
11

Μπορείς να χρησιμοποιήσεις:

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
Απαντήθηκε 23/08/2010 στις 12:00
πηγή χρήστη

ψήφοι
43

Ακούγεται σαν μια διαφήμιση 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
Απαντήθηκε 21/11/2012 στις 23:05
πηγή χρήστη

ψήφοι
5

Μπορείτε να χρησιμοποιήσετε το απλό soupparserαπό τοlxml

Παράδειγμα:

from lxml.html.soupparser import fromstring

tree = fromstring("<a>Find me!</a>")
print tree.xpath("//a/text()")
Απαντήθηκε 15/11/2015 στις 03:31
πηγή χρήστη

ψήφοι
3

Αν θέλετε να έχετε τη δύναμη της 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!'
Απαντήθηκε 16/12/2017 στις 20:16
πηγή χρήστη

ψήφοι
0

Αν πρόκειται να το χρειαστείτε για html :

import lxml.html as html
root  = html.fromstring(string)
root.xpath('//meta')
Απαντήθηκε 29/05/2019 στις 15:48
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more