Как использовать Xpath в Python? - PullRequest
206 голосов
/ 12 августа 2008

Что такое библиотека? Есть ли полная реализация? Как используется библиотека? Где его сайт?

Ответы [ 12 ]

118 голосов
/ 26 августа 2008

libxml2 имеет ряд преимуществ:

  1. Соответствие спецификации
  2. Активное развитие и участие сообщества
  3. Скорость. Это действительно оболочка Python для реализации на Си.
  4. Ubiquity. Библиотека libxml2 широко распространена и поэтому хорошо протестирована.

Недостатки включают в себя:

  1. Соответствие спецификации . Это строгое Такие вещи, как обработка пространства имен по умолчанию, проще в других библиотеках.
  2. Использование нативного кода. Это может быть проблемой в зависимости от того, как ваше приложение распределено / развернуто. Доступны RPM, которые облегчают эту боль.
  3. Ручная обработка ресурсов. Обратите внимание на приведенный ниже пример вызовов freeDoc () и xpathFreeContext (). Это не очень Pythonic.

Если вы делаете простой выбор пути, придерживайтесь ElementTree (который включен в Python 2.5). Если вам нужно полное соответствие спецификациям или грубая скорость и вы можете справиться с распространением нативного кода, используйте libxml2.

Пример использования XPath libxml2


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

82 голосов
/ 12 августа 2008

Пакет lxml поддерживает xpath. Кажется, это работает довольно хорошо, хотя у меня были некоторые проблемы с осью self ::. Также есть Amara , но я не использовал это лично.

48 голосов
/ 22 ноября 2012

Похоже, реклама 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 голосов
/ 14 ноября 2009

Используйте LXML. LXML использует всю мощь libxml2 и libxslt, но заключает их в более «Pythonic» привязки, чем в привязки Python, которые являются родными для этих библиотек. Таким образом, он получает полную реализацию XPath 1.0. Native ElemenTree поддерживает ограниченное подмножество XPath, хотя оно может быть достаточно для ваших нужд.

28 голосов
/ 23 января 2010

Другой вариант - py-dom-xpath , он работает без проблем с minidom и является чистым Python, поэтому работает на appengine.

import xpath
xpath.find('//item', doc)
13 голосов
/ 23 августа 2010

Вы можете использовать:

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
9 голосов
/ 14 августа 2008

Последняя версия elementtree очень хорошо поддерживает XPath. Не будучи экспертом по XPath, я не могу точно сказать, является ли реализация полной, но она удовлетворила большинство моих потребностей при работе в Python. Я также использую lxml и PyXML и нахожу этри хорошим, потому что это стандартный модуль.

ПРИМЕЧАНИЕ. С тех пор я нашел lxml, и для меня это определенно лучшая библиотека XML для Python. Он также хорошо работает с XPath (хотя, может быть, не полная реализация).

5 голосов
/ 17 декабря 2017

Если вы хотите объединить возможности 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!'
5 голосов
/ 15 ноября 2015

Вы можете использовать простые soupparser из lxml

Пример:

from lxml.html.soupparser import fromstring

tree = fromstring("<a>Find me!</a>")
print tree.xpath("//a/text()")
4 голосов
/ 23 августа 2010

Другая библиотека - 4Suite: http://sourceforge.net/projects/foursuite/

Я не знаю, насколько это соответствует спецификации. Но это сработало очень хорошо для моего использования. Это выглядит заброшенным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...