Подтвердить что ты не робот

Получить XPATH для всех узлов

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

4b9b3361

Ответ 1

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

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

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

//*

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

/descendant-or-self::node()

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

//text()

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

//comment()

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

//processing-instruction()

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

//@* 

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

//namespace::*

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

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

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

/descendant-or-self::node() | //@* | //namespace::*

Ответ 2

Если это полезно для кого-то другого, если вы используете 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>]