получить XPATH для всех узлов - PullRequest
26 голосов
/ 13 апреля 2011

Есть ли библиотека, которая может дать мне XPATH для всех узлов на странице HTML?

Ответы [ 2 ]

39 голосов
/ 13 апреля 2011

есть ли библиотека, которая может дать мне XPATH для всех узлов на странице HTML

Да, если эта HTML-страница является правильно сформированным XML-документом .

В зависимости от того, что вы понимаете под "узлом" ...

//*

выделяет все элементы в документе.

/descendant-or-self::node()

выбирает все элементы, текстовые узлы, инструкции по обработке, узлы комментариев и корневой узел /.

//text()

выделяет все текстовые узлы в документе.

//comment()

выбирает все узлы комментариев в документе.

//processing-instruction()

выбирает все инструкции по обработке в документе.

//@* 

выбирает все узлы атрибута в документе.

//namespace::*

выбирает все узлы пространства имен в документе.

Наконец, вы можете объединить любое из приведенных выше выражений, используя оператор объединения (|).

Таким образом, я считаю, что следующее выражение действительно выбирает «все узлы» любого XML-документа:

/descendant-or-self::node() | //@* | //namespace::*
1 голос
/ 17 февраля 2015

В случае, если это будет полезно для кого-то другого, если вы используете python / lxml, вам сначала нужно иметь дерево, а затем запросить это дерево с путями XPATH, которые Dimitre перечисляет выше.

Чтобы получить дерево:

import lxml
from lxml import html, etree

your_webpage_string = "<html><head><title>test<body><h1>page title</h3>"
bad_html = lxml.html.fromstring(your_webpage_string)
good_html = etree.tostring(root, pretty_print=True).strip()
your_tree = etree.fromstring(good_html)
all_xpaths = your_tree.xpath('//*') 

В последней строке замените '// *' на любой xpath, который вы хотите. all_xpaths теперь список выглядит так:

[<Element html at 0x7ff740b24b90>,
 <Element head at 0x7ff740b24d88>,
 <Element title at 0x7ff740b24dd0>,
 <Element body at 0x7ff740b24e18>,
 <Element h1 at 0x7ff740b24e60>]
...