Question Comment analyser et traiter HTML / XML en PHP?


Comment peut-on analyser HTML / XML et en extraire des informations?


1894
2017-08-26 17:19


origine


Réponses:


Extensions XML natives

Je préfère utiliser l'un des extensions XML natives Comme ils sont livrés avec PHP, ils sont généralement plus rapides que toutes les librairies tierces et me donnent tout le contrôle dont j'ai besoin sur le balisage.

DOM

L'extension DOM vous permet de travailler sur des documents XML via l'API DOM avec PHP 5. Il s'agit d'une implémentation du Core Object Level 3 du modèle d'objet document du W3C, une interface plate-forme et langage qui permet aux programmes et scripts d'accéder dynamiquement le contenu, la structure et le style des documents.

DOM est capable d'analyser et de modifier le HTML réel (cassé) et il peut le faire Requêtes XPath. C'est basé sur libxml.

Il faut du temps pour être productif avec DOM, mais ce temps en vaut la peine. Puisque DOM est une interface indépendante du langage, vous trouverez des implémentations dans de nombreuses langues, donc si vous avez besoin de changer votre langage de programmation, il y a de fortes chances que vous sachiez déjà comment utiliser l'API DOM de cette langue.

Un exemple d'utilisation basique peut être trouvé dans Saisir l'attribut href d'un élément A et un aperçu conceptuel général peut être trouvé à DOMDocument en php

Comment utiliser l'extension DOM a été largement couvert sur StackOverflow, donc si vous choisissez de l'utiliser, vous pouvez être sûr que la plupart des problèmes rencontrés peuvent être résolus en recherchant / parcourant Stack Overflow.

XMLReader

L'extension XMLReader est un analyseur d'extraction XML. Le lecteur agit comme un curseur vers l'avant sur le flux de documents et s'arrête sur chaque nœud en cours de route.

XMLReader, comme DOM, est basé sur libxml. Je ne suis pas conscient de la façon de déclencher le module HTML Parser. Il est donc probable que l'utilisation de XMLReader pour analyser du code HTML rompu soit moins robuste que l'utilisation de DOM où vous pouvez lui indiquer explicitement d'utiliser le module HTML Parser.

Un exemple d'utilisation de base peut être trouvé à obtenir toutes les valeurs de balises h1 en utilisant php

XML Parser

Cette extension vous permet de créer des analyseurs XML, puis de définir des gestionnaires pour différents événements XML. Chaque analyseur XML possède également quelques paramètres que vous pouvez ajuster.

La bibliothèque XML Parser est également basée sur libxml et implémente un SAXO style XML push parser. Il peut être un meilleur choix pour la gestion de la mémoire que DOM ou SimpleXML, mais sera plus difficile à utiliser que l'analyseur de pull implémenté par XMLReader.

SimpleXml

L'extension SimpleXML fournit un jeu d'outils très simple et facilement utilisable pour convertir du XML en un objet qui peut être traité avec des sélecteurs de propriétés normales et des itérateurs de tableaux.

SimpleXML est une option lorsque vous savez que le code HTML est XHTML valide. Si vous avez besoin d'analyser le HTML cassé, ne prenez même pas en compte SimpleXml, car il va s'étouffer.

Un exemple d'utilisation de base peut être trouvé à Un programme simple pour les valeurs de nœud et de noeud CRUD du fichier xml et voici beaucoup d'exemples supplémentaires dans le manuel PHP.


Bibliothèques tierces (basées sur libxml)

Si vous préférez utiliser une bibliothèque tierce, je suggère d'utiliser une bibliothèque qui utilise réellement DOM/libxml dessous au lieu de l'analyse de chaîne.

FluentDom

FluentDOM fournit une interface XML fluide de type jQuery pour le DOMDocument en PHP. Les sélecteurs sont écrits en XPath ou CSS (en utilisant un convertisseur CSS vers XPath). Les versions actuelles étendent le DOM implémentant des interfaces standard et ajoutent des fonctionnalités du DOM Living Standard. FluentDOM peut charger des formats tels que JSON, CSV, JsonML, RabbitFish et autres. Peut être installé via Composer.

HtmlPageDom

Wa72 \ HtmlPageDom` est une bibliothèque PHP pour une manipulation facile de HTML   documents en utilisant Il nécessite DomCrawler de Symfony2   Composants pour traverser le   Arbre DOM et l'étend en ajoutant des méthodes pour manipuler le DOM   arbre de documents HTML.

phpQuery (non mis à jour pour les années)

phpQuery est une API Document DOM (Document Object Model) pilotée par un sélecteur CSS3 côté serveur, basée sur la bibliothèque jQuery JavaScript écrite en PHP5 et fournit une interface de ligne de commande (CLI) supplémentaire.

Regarde aussi: https://github.com/electrolinux/phpquery

Zend_Dom

Zend_Dom fournit des outils pour travailler avec des documents et des structures DOM. Actuellement, nous proposons Zend_Dom_Query, qui fournit une interface unifiée pour interroger les documents DOM en utilisant à la fois les sélecteurs XPath et CSS.

QueryPath

QueryPath est une bibliothèque PHP pour la manipulation de XML et HTML. Il est conçu pour fonctionner non seulement avec des fichiers locaux, mais également avec des services Web et des ressources de base de données. Il implémente une grande partie de l'interface jQuery (y compris les sélecteurs de style CSS), mais il est fortement adapté pour une utilisation côté serveur. Peut être installé via Composer.

fDOMDocument

fDOMDocument étend le DOM standard pour utiliser les exceptions à toutes les occasions d'erreurs au lieu des avertissements ou des avis PHP. Ils ajoutent également diverses méthodes et raccourcis personnalisés pour plus de commodité et pour simplifier l'utilisation de DOM.

sabre / xml

sabre / xml est une bibliothèque qui enveloppe et étend les classes XMLReader et XMLWriter pour créer un simple système de mappage "xml to object / array" et un motif de conception. Écrire et lire du XML est un passage unique et peut donc être rapide et nécessiter peu de mémoire sur les gros fichiers xml.

FluidXML

FluidXML est une bibliothèque PHP pour manipuler XML avec une API concise et fluide.   Il exploite XPath et le modèle de programmation fluide pour être amusant et efficace.


3ème partie (pas basée sur libxml)

L'avantage de développer sur DOM / libxml est que vous obtenez de bonnes performances dès la sortie de la boîte car vous utilisez une extension native. Cependant, toutes les bibliothèques tierces ne suivent pas cette voie. Certains d'entre eux énumérés ci-dessous

PHP Simple HTML DOM Parser

  • Un analyseur HTML DOM écrit en PHP5 + vous permet de manipuler HTML de façon très simple!
  • Nécessite PHP 5+.
  • Supporte le HTML invalide.
  • Trouver des balises sur une page HTML avec des sélecteurs comme jQuery.
  • Extraire le contenu de HTML dans une seule ligne.

Je ne recommande généralement pas cet analyseur. La base de code est horrible et l'analyseur lui-même est plutôt lent et a faim de mémoire. Tous les sélecteurs jQuery (tels que sélecteurs d'enfant) sont possibles. N'importe quelle bibliothèque basée sur libxml devrait surclasser cela facilement.

PHP Html Parser

PHPHtmlParser est un analyseur html simple et flexible qui vous permet de sélectionner des tags en utilisant n'importe quel sélecteur css, comme jQuery. Le but est d'aider au développement d'outils qui nécessitent un moyen rapide et facile d'éliminer le HTML, que ce soit valide ou non! Ce projet a été originalement supporté par sunra / php-simple-html-dom-parser mais le support semble s'être arrêté donc ce projet est mon adaptation de son travail précédent.

Encore une fois, je ne recommanderais pas cet analyseur. C'est plutôt lent avec une utilisation élevée du processeur. Il n'y a également aucune fonction pour effacer la mémoire des objets DOM créés. Ces problèmes s'échelonnent particulièrement avec les boucles imbriquées. La documentation elle-même est inexacte et mal orthographiée, sans réponses aux correctifs depuis le 14 avril 16.

Ganon

  • Un tokenizer universel et HTML / XML / RSS DOM Parser      
    • Capacité à manipuler des éléments et leurs attributs
    • Prend en charge HTML et UTF8 non valides
  • Peut effectuer des requêtes de type CSS3 avancées sur les éléments (comme jQuery - espaces de noms supportés)
  • Un embellisseur HTML (comme HTML Tidy)      
    • Réduire le CSS et Javascript
    • Trier les attributs, modifier le casse des caractères, corriger l'indentation, etc.
  • Extensible      
    • Analyse de documents à l'aide de rappels basés sur le caractère / jeton en cours
    • Opérations séparées dans des fonctions plus petites pour un dépassement facile
  • Rapide et facile

Je ne l'ai jamais utilisé. Je ne peux pas dire si c'est bon.


HTML 5

Vous pouvez utiliser ce qui précède pour analyser HTML5, mais il peut y avoir des bizarreries en raison du balisage HTML5 permet. Donc, pour HTML5, vous voulez utiliser un analyseur dédié, comme

html5lib

Implémentation Python et PHP d'un analyseur HTML basé sur la spécification WHATWG HTML5 pour une compatibilité maximale avec les principaux navigateurs Web de bureau.

Nous pourrions voir plus d'analyseurs dédiés une fois le HTML5 finalisé. Il y a aussi un blogpost par les W3 intitulé Comment faire pour l'analyse HTML 5 Cela vaut la peine de vérifier.


Services Web

Si vous n'avez pas envie de programmer PHP, vous pouvez également utiliser les services Web. En général, j'ai trouvé très peu d'utilité pour ceux-ci, mais c'est juste moi et mes cas d'utilisation.

YQL

Le service Web YQL permet aux applications d'interroger, de filtrer et de combiner des données provenant de différentes sources sur Internet. Les instructions YQL ont une syntaxe de type SQL, familière à tout développeur ayant une expérience de base de données.

ScraperWiki.

L'interface externe de ScraperWiki vous permet d'extraire des données sous la forme que vous souhaitez utiliser sur le web ou dans vos propres applications. Vous pouvez également extraire des informations sur l'état de tout racleur.


Expressions régulières

Dernier et dernier moins recommandé, vous pouvez extraire des données du HTML avec expressions régulières. En général, l'utilisation d'expressions régulières sur HTML est déconseillée.

La plupart des extraits que vous trouverez sur le Web pour faire correspondre le balisage sont fragiles. Dans la plupart des cas, ils ne travaillent que pour un élément HTML très particulier. De minuscules modifications de balisage, telles que l'ajout d'espaces, l'ajout ou la modification d'attributs dans une balise, peuvent entraîner l'échec de RegEx lorsqu'il n'est pas correctement écrit. Vous devriez savoir ce que vous faites avant d'utiliser RegEx sur HTML.

Les parseurs HTML connaissent déjà les règles syntaxiques du HTML. Des expressions régulières doivent être enseignées pour chaque nouveau RegEx que vous écrivez. Les RegEx sont bien dans certains cas, mais cela dépend vraiment de votre cas d'utilisation.

Toi peut écrire des analyseurs plus fiablesmais en écrivant complet et fiable Un analyseur personnalisé avec des expressions régulières est une perte de temps lorsque les bibliothèques mentionnées ci-dessus existent déjà et font un bien meilleur travail à ce sujet.

Regarde aussi Parsing Html La voie de Cthulhu


Livres

Si vous voulez dépenser de l'argent, jetez un oeil à

Je ne suis pas affilié à PHP Architect ou aux auteurs.


1718
2017-08-26 17:18



Essayer Simple HTML DOM Parser

  • Un analyseur DOM HTML écrit en PHP 5+ qui vous permet de manipuler HTML de façon très simple!
  • Nécessite PHP 5+.
  • Supporte le HTML invalide.
  • Trouver des balises sur une page HTML avec des sélecteurs comme jQuery.
  • Extraire le contenu de HTML dans une seule ligne.
  • Télécharger


Exemples:


Comment obtenir des éléments HTML:

// Create DOM from URL or file
$html = file_get_html('http://www.example.com/');

// Find all images
foreach($html->find('img') as $element)
       echo $element->src . '<br>';

// Find all links
foreach($html->find('a') as $element)
       echo $element->href . '<br>';


Comment modifier les éléments HTML:

// Create DOM from string
$html = str_get_html('<div id="hello">Hello</div><div id="world">World</div>');

$html->find('div', 1)->class = 'bar';

$html->find('div[id=hello]', 0)->innertext = 'foo';

echo $html;


Extraire le contenu du HTML:

// Dump contents (without tags) from HTML
echo file_get_html('http://www.google.com/')->plaintext;


Scraping Slashdot:

// Create DOM from URL
$html = file_get_html('http://slashdot.org/');

// Find all article blocks
foreach($html->find('div.article') as $article) {
    $item['title']     = $article->find('div.title', 0)->plaintext;
    $item['intro']    = $article->find('div.intro', 0)->plaintext;
    $item['details'] = $article->find('div.details', 0)->plaintext;
    $articles[] = $item;
}

print_r($articles);

303
2017-11-26 20:02



Juste utiliser DOMDocument-> loadHTML () et être fait avec. L'algorithme d'analyse HTML de libxml est assez bon et rapide, et contrairement à la croyance populaire, il ne s'étouffe pas sur du HTML mal formé.


224
2017-11-15 22:16



Pourquoi vous ne devriez pas et quand tu devrais utiliser des expressions régulières?

Tout d'abord, un terme commun inapproprié: les expressions rationnelles ne sont pas pour "analyse" HTML Regexes peut cependant "extrait" Les données. L'extraction est ce pour quoi ils sont faits. L'inconvénient majeur de l'extraction HTML regex par rapport aux kits d'outils SGML ou aux analyseurs XML de base est leur effort syntaxique et leur fiabilité variable.

Considérez que faire une regex d'extraction HTML assez fiable:

<a\s+class="?playbutton\d?[^>]+id="(\d+)".+?    <a\s+class="[\w\s]*title
[\w\s]*"[^>]+href="(http://[^">]+)"[^>]*>([^<>]+)</a>.+?

est beaucoup moins lisible qu'un simple équivalent de phpQuery ou de QueryPath:

$div->find(".stationcool a")->attr("title");

Il existe cependant des cas d'utilisation spécifiques où ils peuvent aider.

  • De nombreuses interfaces de traversée de DOM ne révèlent pas les commentaires HTML <!--, qui sont cependant parfois les ancres les plus utiles pour l'extraction. En particulier les variantes pseudo-HTML <$var> ou les résidus SGML sont faciles à apprivoiser avec les expressions rationnelles.
  • Souvent, les expressions régulières peuvent sauver le post-traitement. Cependant, les entités HTML nécessitent souvent un gardiennage manuel.
  • Et enfin, pour eTâches extrêmement simples comme extraire <img src = urls, ils sont en fait un outil probable. L'avantage de la rapidité par rapport aux parseurs SGML / XML vient surtout à jouer pour ces procédures d'extraction très basiques.

Il est même parfois conseillé de pré-extraire un extrait de HTML en utilisant des expressions régulières /<!--CONTENT-->(.+?)<!--END-->/et traiter le reste en utilisant les interfaces de l'analyseur HTML plus simples.

Remarque: J'ai réellement ceci application, où j'emploie alternativement l'analyse XML et les expressions régulières. La semaine dernière, l'analyse syntaxique de PyQuery a été interrompue et l'expression régulière fonctionnait encore. Oui bizarre, et je ne peux pas l'expliquer moi-même. Mais c'est arrivé.
Donc, s'il vous plaît, ne votez pas sur les considérations du monde réel, juste parce que cela ne correspond pas à la règle regex = evil. Mais ne votons pas trop. C'est juste un sidenote pour ce sujet.


136
2018-05-01 02:04



phpQuery et QueryPath sont extrêmement similaires dans la réplication de l'API jQuery fluide. C'est aussi pourquoi ils sont deux des approches les plus faciles à correctement analyser le HTML en PHP.

Exemples pour QueryPath

Fondamentalement, vous créez d'abord un arbre DOM interrogeable à partir d'une chaîne HTML:

 $qp = qp("<html><body><h1>title</h1>..."); // or give filename or URL

L'objet résultant contient une représentation arborescente complète du document HTML. Il peut être traversé en utilisant des méthodes DOM. Mais l'approche courante consiste à utiliser des sélecteurs CSS comme dans jQuery:

 $qp->find("div.classname")->children()->...;

 foreach ($qp->find("p img") as $img) {
     print qp($img)->attr("src");
 }

La plupart du temps, vous voulez utiliser simple #id et .class ou DIV sélecteurs d'étiquettes pour ->find(). Mais vous pouvez aussi utiliser XPath déclarations, qui sont parfois plus rapides. Aussi des méthodes jQuery typiques comme ->children() et ->text() et en particulier ->attr() simplifier l'extraction des bons extraits HTML. (Et ont déjà leurs entités SGML décodées.)

 $qp->xpath("//div/p[1]");  // get first paragraph in a div

QueryPath permet également d'injecter de nouvelles balises dans le flux (->append), et plus tard sortir et d'alléger un document mis à jour (->writeHTML). Il peut non seulement analyser le HTML malformé, mais aussi divers dialectes XML (avec des espaces de noms), et même extraire des données à partir de microformats HTML (XFN, vCard).

 $qp->find("a[target=_blank]")->toggleClass("usability-blunder");

.

phpQuery ou QueryPath?

En général, QueryPath est mieux adapté à la manipulation de documents. Alors que phpQuery implémente aussi des pseudo méthodes AJAX (juste des requêtes HTTP) pour ressembler plus à jQuery. Il est dit que phpQuery est souvent plus rapide que QueryPath (en raison de moins de fonctionnalités globales).

Pour plus d'informations sur les différences voir cette comparaison sur la machine de wayback de tagbyte.org. (La source originale a disparu, alors voici un lien vers les archives internet.) Oui, vous pouvez toujours localiser les pages manquantes, les gens.)

Et voici une introduction complète à QueryPath.

Avantages

  • Simplicité et fiabilité
  • Des alternatives simples à utiliser ->find("a img, a object, div a")
  • Désactivation correcte des données (par rapport à l'expression régulière)

126
2017-08-26 17:20



Simple HTML DOM est un excellent parseur open-source:

simplehtmldom.sourceforge

Il traite les éléments DOM de manière orientée objet, et la nouvelle itération a beaucoup de couverture pour le code non conforme. Il y a aussi d'excellentes fonctions comme celles que vous verriez en JavaScript, comme la fonction "find", qui retournera toutes les occurrences d'éléments de ce nom de tag.

Je l'ai utilisé dans un certain nombre d'outils, en le testant sur de nombreux types de pages Web, et je pense que cela fonctionne très bien.


85
2017-10-04 13:14



Une approche générale que je n'ai pas vu mentionné ici est d'exécuter HTML à travers Rangé, qui peut être défini pour cracher XHTML garanti-valide. Vous pouvez ensuite utiliser n'importe quelle ancienne bibliothèque XML.

Mais à votre problème spécifique, vous devriez jeter un oeil à ce projet: http://fivefilters.org/content-only/ - C'est une version modifiée du Lisibilité algorithme, qui est conçu pour extraire uniquement le contenu textuel (pas les en-têtes et les pieds de page) d'une page.


58
2017-11-06 21:02



Pour 1a et 2: je voterais pour la nouvelle classe Symfony Componet DOMCrawler ( DomCrawler ). Cette classe permet des requêtes similaires aux sélecteurs CSS. Jetez un oeil à cette présentation pour des exemples concrets: news-of-the-symfony2-monde.

Le composant est conçu pour fonctionner de manière autonome et peut être utilisé sans Symfony.

Le seul inconvénient est qu'il ne fonctionnera qu'avec PHP 5.3 ou plus récent.


54
2018-04-14 19:08