web-dev-qa-db-fra.com

obtenir XPATH pour tous les nœuds

Existe-t-il une bibliothèque qui peut me donner le XPATH pour tous les nœuds d'une page HTML?

26
user583726

y a-t-il une bibliothèque qui peut me donner XPATH pour tous les nœuds de la page HTML

Oui, si cette page HTML est un document XML bien formé.

Selon ce que vous entendez par "nœud" ...

//*

sélectionne tous les éléments du document.

/descendant-or-self::node()

sélectionne tous les éléments, les nœuds de texte, les instructions de traitement, les nœuds de commentaire et le nœud racine /.

//text()

sélectionne tous les nœuds de texte du document.

//comment()

sélectionne tous les nœuds de commentaire dans le document.

//processing-instruction()

sélectionne toutes les instructions de traitement dans le document.

//@* 

sélectionne tous les nœuds d'attribut du document.

//namespace::*

sélectionne tous les nœuds d'espace de noms dans le document.

Enfin, vous pouvez combiner l'une des expressions ci-dessus à l'aide de l'union (|).

Ainsi, je crois que l'expression suivante sélectionne vraiment "tous les nœuds" de tout document XML:

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

Dans le cas où cela est utile pour quelqu'un d'autre, si vous utilisez python/lxml, vous devrez d'abord avoir un arbre, puis interroger cet arbre avec les chemins XPATH que Dimitre énumère ci-dessus.

Pour obtenir l'arbre:

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('//*') 

Sur la dernière ligne, remplacez '// *' par le chemin x que vous souhaitez. all_xpaths est maintenant une liste qui ressemble à ceci:

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