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

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

12.08.2008 11:28:36
У меня есть это подлое подозрение, что ответы на этот вопрос сейчас немного устарели.
Warren P 26.11.2012 20:44:19
Ответ @ gringo-suave выглядит как хорошее обновление. stackoverflow.com/a/13504511/1450294
Michael Scheper 18.06.2013 08:09:02
Scrapy предлагает XPath селекторы .
cs95 20.04.2019 20:04:32
12 ОТВЕТОВ

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

85
10.01.2013 19:26:13
Амара довольно милая, и не всегда нужен xpath.
gatoatigrado 5.12.2009 05:35:47
Пожалуйста, добавьте некоторые основные сведения о том, как использовать XPath с lxml.
jpmc26 30.10.2018 17:57:24

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'

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

3
12.08.2008 20:50:44

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

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

9
12.01.2009 22:57:39
Поддержка ElementTree XPath в настоящее время минимальна в лучшем случае. В функциональности имеются огромные дыры, такие как отсутствие селекторов атрибутов, отсутствие осей, отличных от заданных по умолчанию, отсутствие индексации дочерних элементов и т. Д. В версии 1.3 (в альфа-версии) добавлены некоторые из этих функций, но это по-прежнему неосознанно частичная реализация.
James Brady 9.01.2009 23:26:59

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

129
7.02.2016 18:16:49
используя python 2.7.10 на osx, мне пришлось импортировать ElementTree какfrom xml.etree.ElementTree import ElementTree
Ben Page 11.01.2016 14:34:55
потому что это оболочка C, вы можете столкнуться с трудностями при ее развертывании в AWS Lambda, если вы не скомпилируете экземпляр EC2 или образ Docker из AWS Linux
CpILL 12.07.2018 13:51:22

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

39
13.11.2009 23:11:17

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

import xpath
xpath.find('//item', doc)
29
27.01.2013 14:10:01
Проще, чем lxml и libxml2, если вы уже работаете с minidom. Работает красиво и более "Pythonic". Функция contextin findпозволяет вам использовать другой результат xpath в качестве нового контекста поиска.
Ben 24.10.2011 20:19:13
Я тоже использовал py-dom-xpath, когда пишу плагин, потому что это чистый python. Но я не думаю, что это больше поддерживается, и помните об этой ошибке («Не удается получить доступ к элементу с именем« text »»): code.google.com/p/py-dom-xpath/issues/detail?id = 8
Jon Coombs 6.02.2014 20:52:06

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

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

4
23.08.2010 12:57:47

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

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
14
23.08.2010 13:00:01
когда я попробовал код PyXML, я получил ImportError: No module named extотfrom xml.dom.ext.reader import Sax2
Aminah Nuraini 30.11.2015 19:24:35

Похоже, реклама 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
56
9.01.2020 07:18:21

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

Пример:

from lxml.html.soupparser import fromstring

tree = fromstring("<a>Find me!</a>")
print tree.xpath("//a/text()")
8
25.04.2016 01:59:42
Какая разница с использованием soupparser?
Padraic Cunningham 20.10.2016 23:59:44
Это просто альтернатива
Aminah Nuraini 21.10.2016 04:43:25

Если вы хотите использовать возможности 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!'
6
17.04.2018 11:32:54
как должен выглядеть мой Xpath, если я хочу получить "Link 1" и "Link 2"?
weefwefwqg3 17.04.2018 05:10:54
для получения текста это должно быть что-то вроде//li/a/text()
eLRuLL 17.04.2018 11:34:21

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

import lxml.html as html
root  = html.fromstring(string)
root.xpath('//meta')
0
29.05.2019 13:48:30