Как использовать 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'

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

Ответил 12/08/2008 в 18:34
источник пользователем

голоса
9

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

Примечание: С тех пор я нашел LXML и для меня это определенно лучший XML Lib там для Python. Это делает XPath хорошо, как хорошо (хотя опять же, возможно, не в полной реализации).

Ответил 14/08/2008 в 08:48
источник пользователем

голоса
115

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

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

Downsides включают в себя:

  1. Соответствие в спецификации . Это строгое. Такие вещи , как обработка пространства имен по умолчанию проще в других библиотеках.
  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, но оборачивает их в более привязках «вещих», чем привязки Python, которые являются родными для этих библиотек. Таким образом, он получает полную реализацию XPath 1.0. Native Elementree поддерживает ограниченное подмножество XPath, хотя это может быть достаточно для ваших нужд.

Ответил 13/11/2009 в 22:11
источник пользователем

голоса
27

Другим вариантом является ру-дом-XPath , он работает с minidom и чисто Python так работает на AppEngine.

import xpath
xpath.find('//item', doc)
Ответил 23/01/2010 в 08:30
источник пользователем

голоса
4

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

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

Ответил 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 включен в библиотеку станд. Под 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