Как использовать XPath в Python?

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

У меня есть подлое подозрение, что ответы на этот вопрос сейчас немного устарели.

Warren P 27.11.2012 00:44

Ответ @ gringo-suave выглядит как хорошее обновление. stackoverflow.com/a/13504511/1450294

Michael Scheper 18.06.2013 12:09

Scrapy предлагает Селекторы XPath.

cs95 20.04.2019 23:04

Как говорит @WarrenP, большинство ответов здесь - чрезвычайно устаревший старый Python-2.x, действительно устаревший. Может, этот вопрос стоит пометить python-2.x

smci 08.06.2020 13:00
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
231
4
303 254
12

Ответы 12

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

Амара довольно хороша, и не всегда нужен xpath.

gatoatigrado 05.12.2009 08:35

Добавьте основные сведения о том, как использовать XPath с lxml.

jpmc26 30.10.2018 20:57

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'

В худшем случае вам, возможно, придется построить его самостоятельно. Этот пакет больше не поддерживается, но все еще отлично работает и работает с современными Python 2.x. Базовая документация - здесь.

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

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

Поддержка XPath в ElementTree в настоящее время в лучшем случае минимальна. Существуют огромные пробелы в функциональности, такие как отсутствие селекторов атрибутов, отсутствие осей по умолчанию, отсутствие дочерней индексации и т. д. Версия 1.3 (в альфа-версии) добавляет некоторые из этих функций, но это все еще бесстыдно частичная реализация.

James Brady 10.01.2009 02:26

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

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

К недостаткам можно отнести:

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

Если вы выбираете простой путь, придерживайтесь ЭлементДерево (который включен в 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

используя python 2.7.10 на osx, мне пришлось импортировать ElementTree как from xml.etree.ElementTree import ElementTree

Ben Page 11.01.2016 17:34

поскольку это оболочка C, вы можете столкнуться с трудностями при развертывании ее в AWS Lambda, если вы не скомпилируете ее на экземпляре EC2 или образе Docker для AWS Linux.

CpILL 12.07.2018 16:51

Строгость - не недостаток.

Dragas 18.07.2020 20:12

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

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

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

Проще, чем lxml и libxml2, если вы уже работаете с minidom. Красиво работает и более "питоничен". context в функции find позволяет использовать другой результат xpath в качестве нового контекста поиска.

Ben 25.10.2011 00:19

Я тоже использовал py-dom-xpath, когда пишу плагин, потому что это чистый питон. Но я не думаю, что он больше поддерживается, и я знаю об этой ошибке («Невозможно получить доступ к элементу с именем 'text'»): code.google.com/p/py-dom-xpath/issues/detail?id=8

Jon Coombs 07.02.2014 00:52

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

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

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

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 30.11.2015 22:24

Похоже здесь на рекламу в формате 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

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

Пример:

from lxml.html.soupparser import fromstring

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

Какая разница в использовании суппарсера?

Padraic Cunningham 21.10.2016 02:59

Это просто альтернатива

Aminah Nuraini 21.10.2016 07:43

Если вы хотите, чтобы мощность 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!'

как должен выглядеть мой Xpath, если я хочу получить «Ссылка 1» и «Ссылка 2»?

weefwefwqg3 17.04.2018 08:10

для получения текста это должно быть что-то вроде //li/a/text()

eLRuLL 17.04.2018 14:34

Если он вам понадобится для html:

import lxml.html as html
root  = html.fromstring(string)
root.xpath('//meta')

Другие вопросы по теме