web-dev-qa-db-fra.com

Parse HTML via XPath

Dans .NET, j'ai trouvé cette excellente bibliothèque, htmlagilitypack qui vous permet d'analyser facilement HTML sans bien formé à l'aide de XPath. J'ai utilisé cela pendant quelques années dans mes sites .NET, mais j'ai dû me contenter de bibliothèques plus douloureuses pour mon python, Ruby et d'autres projets. Est-ce que quelqu'un est au courant de bibliothèques similaires Pour d'autres langues?

26
Tristan Havelick

En python, elementtidy analyse la soupe d'étiquette et produit un arbre d'élément, ce qui permet d'interroger en utilisant XPath:

>>> from elementtidy.TidyHTMLTreeBuilder import TidyHTMLTreeBuilder as TB
>>> tb = TB()
>>> tb.feed("<p>Hello world")
>>> e= tb.close()
>>> e.find(".//{http://www.w3.org/1999/xhtml}p")
<Element {http://www.w3.org/1999/xhtml}p at 264eb8>
6
Aaron Maenpaa

Je suis surpris qu'il n'y ait pas une seule mention de LXML. C'est une flamboyante rapide et travaillera dans n'importe quel environnement qui permet aux bibliothèques CPPHON.

Voici comment vous pouvez analyser HTML via XPath à l'aide de LXML .

>>> from lxml import etree
>>> doc = '<foo><bar></bar></foo>'
>>> tree = etree.HTML(doc)

>>> r = tree.xpath('/foo/bar')
>>> len(r)
1
>>> r[0].tag
'bar'

>>> r = tree.xpath('bar')
>>> r[0].tag
'bar'
51
Jagtesh Chadha

beauxoup est un bon Python Library pour traiter avec Messy HTML de manière propre.

5
Ned Batchelder

Les résultats les plus stables que j'ai eues l'utilisation de Souprarser LXML.HTML. Vous devrez installer Python-lxml et Python-beauchsoup, puis vous pouvez procéder comme suit:

from lxml.html.soupparser import fromstring
tree = fromstring('<mal form="ed"><html/>here!')
matches = tree.xpath("./mal[@form=ed]")
5
Gareth Davidson

Il semble que la question puisse être plus précisément indiquée comme " Comment convertir HTML en XML afin que les expressions XPath puissent être évaluées à l'encontre".

Voici deux bons outils:

  1. (( tagsoup , un programme open-source, est un fichier Java et SAX - Tool basé sur la SAX, développé par John Cowan . Ceci est un analyseur conforme à la SAX écrit dans Java qui, au lieu d'analyser XML bien formé ou valide, analyse HTML tel qu'il est trouvé dans la nature: pauvre, méchant et brutal, bien que très souvent loin du court. Tagsoup est conçu pour les personnes qui doivent traiter ces éléments en utilisant un aspect d'une conception d'applications rationnelle. En fournissant une interface SAX, elle Permet à appliquer des outils XML standard à appliquer à la pire HTML. Tagsoup comprend également un processeur de ligne de commande qui lit les fichiers HTML et peut générer un XML HTML propre ou bien formé qui est une approximation étroite à XHTML.
    [.____] taggle est un port commercial C++ de Tagsoup.

  2. (( sgmlreader est un outil développé par Microsoft - ( Chris Lovett .
    [.____] Sgmlreader est une API XMLREADER sur tout document SGML (y compris la prise en charge intégrée pour HTML). Une utilitaire de ligne de commande est également fournie qui génère le résultat XML bien formé.
    Téléchargez le fichier ZIP, y compris l'exécutable autonome et le code source complet: sgmlreader.zip

3
Dimitre Novatchev

Pour Ruby, je recommande vivement Hpricot que JB Evain a souligné. Si vous recherchez un concurrent basé sur la libexte plus rapide, Nokogiri (voir http://tenderlovemakaking.com/2008/10/30/nokogiri-is-reloged/ ) est assez bon aussi (il Prend en charge les recherches XPath et CSS comme Hpricot mais est plus rapide). Il y a une base - wiki et certains points de repère .

2
Chu Yeow

Un exploit exceptionnel est (( l'analyseur PURE XSLT 2.0 de HTML écrit par David Carlisle .

Lire son code serait un excellent exercice d'apprentissage pour tous d'entre nous.

De la description:

" D: htmlparse (chaîne)
[.____] D: HTMLPARSE (chaîne, espace de noms, mode HTML)

[.____] Le formulaire d'argumentation est équivalent à)
[.____] D: HTMLPARSE (chaîne, ' http://ww.w3.org/1999/xhtml ', true ()))

[.____] analyses la chaîne en tant que HTML et/ou XML en utilisant certaines heuristiques intégrées à)
[.____] Contrôle de l'ouverture et de la fermeture des éléments impliqués.

Il n'a pas de connaissances complètes de HTML DTD, mais une liste complète de
Éléments vides et liste complète des définitions d'entité. Entités HTML, et
Les références de caractère décimal et heex sont toutes acceptées. NOTE HTML-ITTITES
[.____] sont reconnus même si HTML-MODE = FALSE ().

Les noms d'élément sont mocassés (si le mode HTML est vrai ()) et placé dans le
Espace de noms spécifié par le paramètre d'espace de noms (qui peut être "" "pour désigner
Espace sans noms à moins que l'entrée ait expliqué les déclarations d'espace de noms, dans
Quel cas ils seront honorés.

Les noms d'attribut sont mocassés si HTML-MODE = TRUE ()
"

Lire une description plus détaillée ( ici .

J'espère que cela a aidé.

À votre santé,

Dimitre Novatchev.

1
Dimitre Novatchev

Il y a une implémentation GRATUITE C pour XML appelée libxml2 qui possède des bits d'API pour XPath que j'ai utilisé avec un grand succès que vous pouvez spécifier HTML comme le chargement du document. Cela a travaillé pour moi pour des documents HTML moins que parfait ..

Pour la plupart, XPath est très utile lorsque le HTML entrant est correctement codé et peut être lu "comme un document XML". Vous voudrez peut-être envisager d'utiliser un utilitaire spécifique à cet effet pour nettoyer les documents HTML. Voici un exemple: http://tiidy.sourceforge.net/

En ce qui concerne ces outils XPath, vous constatez probablement que la plupart des implémentations sont en réalité basées sur des bibliothèques C ou C++ préexistantes telles que libxml2.

1
Klathzazt