Comment analyser et traiter HTML / XML en PHP?

Comment peut-on analyser HTML/XML et en extraire de l'information?

1928
demandé sur RobertPitt 2010-08-26 21:17:19

29 réponses

extensions XML natives

je préfère utiliser l'une des extensions XML natives car ils sont fournis avec PHP, sont généralement plus rapides que tous les libs tiers et me donner tout le contrôle dont j'ai besoin sur le markup.

DOM

L'extension DOM vous permet d'utiliser des documents XML via L'API DOM avec PHP 5. C'est une mise en œuvre de la W3C Document Object Model Core Level 3, une interface neutre sur le plan de la langue et de la plate - forme qui permet aux programmes et aux scripts d'accéder de façon dynamique au contenu, à la structure et au style des documents et de les mettre à jour.

DOM est capable de Parser et de modifier le HTML du monde réel (cassé) et il peut faire requêtes XPath . Il est basé sur libxml .

il faut un certain temps pour obtenir productif avec DOM, mais ce temps est bien la peine de l'OMI. Comme DOM est une interface langagière-agnostique, vous trouverez des implémentations dans de nombreux langages, donc si vous avez besoin de changer votre langage de programmation, il y a des chances que vous sachiez déjà comment utiliser L'API DOM de ce langage.

un exemple d'usage de base peut être trouvé dans saisir l'attribut href d'un élément 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 que vous rencontrez peut être résolu en recherchant/parcourant le débordement de la pile.

XMLReader

L'extension XMLReader est un analyseur de pull XML. Le lecteur agit comme un curseur allant de l'avant sur le flux de documents et s'arrêtant à chaque noeud sur le chemin.

XMLReader, comme DOM, est basé sur libxml. Je ne sais pas comment déclencher le Module HTML Parser, donc il y a des chances que L'utilisation de XMLReader pour analyser le HTML cassé soit moins robuste que L'utilisation de DOM où vous pouvez lui dire explicitement d'utiliser le Module HTML Parser de libxml.

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

XML Parser

cette extension vous permet de créer des analyseurs XML et de définir des gestionnaires pour différents événements XML. Chaque analyseur XML a aussi quelques paramètres que vous pouvez ajuster.

la bibliothèque XML Parser est également basée sur libxml, et implémente un SAX 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 pull. mis en œuvre par XMLReader.

SimpleXml

L'extension SimpleXML fournit un ensemble d'outils très simple et facilement utilisable pour convertir 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 HTML est valide XHTML. Si vous avez besoin de parser le HTML cassé, ne même pas considérer SimpleXml parce qu'il sera étouffer.

un exemple d'utilisation de base peut être trouvé à un programme simple pour les valeurs de noeud de noeud et de noeud de fichier xml et il y a beaucoup d'exemples supplémentaires dans le manuel PHP .


bibliothèques de tiers (basées sur libxml)

si vous préférez utiliser un lib de tiers, je suggère d'utiliser un lib qui utilise réellement DOM / libxml en dessous au lieu de parser les cordes.

FluentDom

FluentDOM fournit une interface XML de type jQuery pour le DOMDocument en PHP. Les sélecteurs sont écrits en XPath ou CSS (en utilisant un convertisseur CSS-XPath). Les versions actuelles étendent les interfaces standard du DOM implementing et ajoutent des fonctionnalités du DOM Living Standard. FluentDOM peut charger des formats comme JSON, CSV, JsonML, RabbitFish et d'autres. Peut être installé par le Compositeur.

HtmlPageDom

Wa72\HtmlPageDom ' est une bibliothèque PHP pour une manipulation facile de HTML les documents qui l'utilisent nécessitent DomCrawler de Symfony2 composants pour la traversée DOM arbre 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 de type Document Object Model (DOM) de type CSS3 de type JavaScript basé sur la bibliothèque jQuery écrite en PHP5 et fournit une Interface en ligne de commande supplémentaire (CLI).

Voir 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 les sélecteurs XPath et CSS.

QueryPath

QueryPath est une bibliothèque PHP pour manipuler XML et HTML. Il est conçu pour fonctionner non seulement avec des fichiers locaux, mais aussi avec des services web et des bases de données ressources. Il implémente une grande partie de l'interface jQuery (y compris les sélecteurs de style CSS), mais il est accordé pour une utilisation Côté Serveur. Peut être installé par le Compositeur.

fDOMDocument

fdomdocument étend le DOM standard pour utiliser des exceptions à toutes les occasions d'erreurs au lieu D'avertissements ou de notices PHP. Ils ajoutent également diverses méthodes personnalisées et raccourcis pour la commodité et pour simplifier la 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 système de cartographie simple "xml to object/array" et un motif de conception. L'écriture et la lecture de XML sont en un seul passage et peuvent donc être rapides et nécessitent une faible mémoire sur les grands fichiers xml.

FluidXML

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


tiers (non basé sur libxml)

l'avantage de construire sur DOM/libxml est que vous obtenez une bonne performance de la boîte parce que vous êtes basé sur une extension native. Cependant, tous les libs de tiers ne suivent pas cette voie. Certains d'entre eux sont énumérés ci-dessous

PHP Simple HTML DOM Parser

  • un DOM parser HTML écrit en PHP5+ vous permet de manipuler HTML d'une manière très facile!
  • Require PHP 5+.
  • supporte HTML invalide.
  • trouver des balises sur une page HTML avec des sélecteurs comme jQuery.
  • extrait du contenu HTML en 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 la mémoire affamée. Tous les sélecteurs jQuery (tels que sélecteurs enfants ) ne sont pas possibles. Toutes les bibliothèques basées sur libxml devraient être plus performantes que cela.

PHP Html Parser

PHPHtmlParser est un simple, flexible, HTML parser qui vous permet de sélectionner des tags en utilisant n'importe quel sélecteur css, comme jQuery. Le but est d'assister dans le développement d'outils qui nécessitent un moyen rapide et facile de supprimer html, qu'il soit valide ou non! Ce projet a été soutenu à l'origine par sunra / php-simple-html-dom-parser mais le soutien semble s'être arrêté de sorte que ce projet est mon adaptation de son travail précédent.

encore une fois, je ne recommande pas ce parser. Il est plutôt lent avec utilisation élevée de CPU. Il n'y a pas non plus de fonction pour effacer la mémoire des objets DOM créés. Ces problèmes sont particulièrement importants avec les boucles imbriquées. La documentation elle-même est inexacte et mal orthographiée, et aucune réponse aux correctifs n'a été reçue depuis le 16 avril.

Ganon

  • un tokenizer universel et HTML / XML / RSS DOM Parser
    • aptitude à manipuler des éléments et leurs attributs
    • supporte HTML et UTF8 invalides
  • peut effectuer des requêtes avancées de type CSS3 sur des éléments (comme jQuery -- namespaces supportées)
  • un html plus beau (comme HTML Tidy)
    • Minify CSS et Javascript
    • trier les attributs, changer le cas de caractères, indentation correcte, etc.
  • Extensible
    • Analyse des documents à l'aide de rappels de base sur le personnage/jeton
    • opérations séparées dans des fonctions plus petites pour une modification facile
  • rapide et facile

ne l'a jamais utilisé. Ne peux pas dire si c'est tout bon.


HTML 5

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

html5lib

implémentations 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 de parsers dédiés une fois le HTML5 finalisé. Il ya aussi un blogpost par le W3's intitulé Comment-pour html 5 parsing qui est intéressant de vérifier.


WebServices

si vous n'avez pas envie de programmer PHP, vous pouvez aussi utiliser des services Web. En général, j'ai trouvé très peu d'utilité pour eux, mais c'est juste moi et mon cas d'utilisation.

YQL

le Service Web de YQL permet aux applications d'interroger, de filtrer et de combiner des données provenant de différentes sources sur Internet. Les déclarations YQL ont une syntaxe de type SQL, familière à tout développeur possédant 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 voulez pour une utilisation sur le web ou dans votre propre application. Vous pouvez également extraire des informations sur l'état d'un grattoir.


Expressions Régulières

Last et le moins recommandé , vous pouvez extraire des données à partir de 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 snippets que vous trouverez sur le web pour correspondre au markup sont fragile. Dans la plupart des cas, ils ne fonctionnent que pour un élément HTML très particulier. De minuscules modifications de markup, comme ajouter des espaces quelque part, ou ajouter, ou changer des attributs dans une balise, peuvent faire échouer le RegEx quand il n'est pas correctement écrit. Vous devez savoir ce que vous faites avant D'utiliser RegEx sur HTML.

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

vous pouvez écrire des analyseurs plus fiables , mais écrire un complet et fiable analyseur personnalisé avec des expressions régulières est une perte de temps lorsque les bibliothèques susmentionnées existent déjà et faire un bien meilleur travail sur ce sujet.

voir Aussi Parsing Html Le Cthulhu Façon


livres

si vous voulez dépenser un peu d'argent, jetez un oeil à

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

1749
répondu Gordon 2018-02-03 18:57:44

Try Simple HTML DOM Parser

  • un DOM parser HTML écrit en PHP 5+ qui vous permet de manipuler HTML d'une manière très facile!
  • Require PHP 5+.
  • supporte HTML invalide.
  • trouver des balises sur une page HTML avec des sélecteurs comme jQuery.
  • extraire le contenu du HTML en une seule ligne.
  • // Dump contents (without tags) from HTML
    echo file_get_html('http://www.google.com/')->plaintext;
    



    Gratter 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);
    
310
répondu Naveed 2015-10-28 17:41:16

il suffit d'utiliser DOMDocument->loadHTML () et être fait avec elle. l'algorithme de parsing HTML de libxml est assez bon et rapide, et contrairement à la croyance populaire, ne s'étouffe pas sur du HTML malformé.

224
répondu Edward Z. Yang 2008-11-26 20:02:44

pourquoi vous ne devriez pas et quand vous devriez utiliser des expressions régulières?

tout d'abord, un nom commun erroné: Regexps ne sont pas pour parsing HTML. Regexes peut cependant " extrait de " "151980920 des données". L'extraction est ce qu'ils sont faits pour. L'inconvénient majeur de l'extraction HTML de regex par rapport aux outils SGML ou aux analyseurs XML de base est leur effort syntaxique et leur fiabilité variable.

Considérer que faire un peu fiable HTML extraction de la regex:

<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 phpQuery ou QueryPath équivalent:

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

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

  • de nombreux frontaux de DOM transversal ne révèlent pas les commentaires HTML <!-- , qui sont cependant parfois les ancrages les plus utiles pour l'extraction. En particulier les variations pseudo-HTML <$var> ou les résidus SGML sont faciles à apprivoiser avec regexps.
  • souvent, les expressions régulières peuvent sauver le post-traitement. Cependant, les entités HTML nécessitent souvent une prise en charge manuelle.
  • et enfin, pour e xtremely simple tasks comme extraire

il est parfois même conseillé de pré-extraire un fragment de HTML en utilisant les expressions régulières /<!--CONTENT-->(.+?)<!--END-->/ et de traiter le reste en utilisant les frondes HTML plus simples.

Note: j'ai en fait cette app , où j'emploie L'analyse XML et des expressions régulières alternativement. La semaine dernière, le parsing PyQuery s'est cassé, et le regex encore travaillé. Oui bizarre, et je ne peux pas l'expliquer moi-même. Mais c'est arrivé.

Alors s'il vous plaît, ne rejetez pas les considérations du monde réel, juste parce qu'elles ne correspondent pas au meme regex=evil. mais ne votons pas trop. C'est juste une note pour ce sujet.

139
répondu mario 2016-05-07 10:43:47

phpQuery et QueryPath sont très similaires dans la réplication, la fluidité de jQuery API. C'est aussi pourquoi ils sont deux des approches les plus faciles à correctement parse HTML en PHP.

Exemples pour QueryPath

en gros, vous créez d'abord un arbre DOM queryable à partir d'une chaîne HTML:

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

le 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 commune est d'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 des sélecteurs d'étiquettes simples #id et .class ou DIV pour ->find() . Mais vous pouvez aussi utiliser les instructions XPath , qui sont parfois plus rapides. Aussi les méthodes typiques de jQuery comme ->children() et ->text() et surtout ->attr() simplifie 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 étiquettes dans le flux ( ->append ), et plus tard de sortir et de prétifier un document mis à jour ( ->writeHTML ). Il ne peut pas seulement analyser 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 or QueryPath?

généralement QueryPath est mieux adapté à la manipulation de documents. Tandis que phpQuery implémente également certaines méthodes de pseudo AJAX (requêtes HTTP seulement) pour ressembler plus étroitement à jQuery. On 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 . comparaison sur la machine wayback de tagbyte.org . (La source originale a disparu, donc voici un lien d'archives internet. Oui, vous pouvez toujours localiser les pages manquantes.)

Et voici "1519490920 complet QueryPath introduction .

avantages

  • simplicité et fiabilité
  • solutions de remplacement simples à utiliser ->find("a img, a object, div a")
  • données correctes non découpées (par rapport au grappage à expression régulière)
127
répondu mario 2012-11-23 04:57:04

Simple HTML DOM est un grand open-source de l'analyseur:

simplehtmldom.sourceforge

il traite les éléments DOM d'une manière orientée objet, et la nouvelle itération a beaucoup de couverture pour le code non conforme. Il y a aussi de grandes fonctions comme JavaScript, comme la fonction "find", qui renvoie toutes les instances d'éléments de ce nom de balise.

j'ai utilisé ceci dans un nombre d'outils, le tester sur de nombreux types de pages web, et je pense qu'il fonctionne très bien.

85
répondu Robert Elwell 2015-10-28 17:39:31

une approche générale que je n'ai pas vu mentionné ici est d'exécuter HTML à travers Tidy , qui peut être réglé pour recracher garanti-valide XHTML. Vous pouvez alors 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 de l'algorithme lisibilité , qui est conçu pour extraire juste le contenu textuel (pas les en-têtes et les pieds de page) à partir d'une page.

58
répondu Eli 2011-05-01 02:04:38

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 du monde réel: Nouvelles-du-symfony2-monde .

le composant est conçu pour fonctionner seul 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
répondu Timo 2013-06-14 10:33:52

on l'appelle communément screen scraping , soit dit en passant. La bibliothèque que j'ai utilisée pour ceci est Simple HTML Dom Parser .

51
répondu Joel Verhagen 2010-08-26 17:20:17

nous avons créé pas mal de chenilles pour nos besoins avant. À la fin de la journée, ce sont généralement de simples expressions régulières qui font le mieux la chose. Alors que les bibliothèques listées ci-dessus sont bonnes pour la raison qu'elles sont créées, si vous savez ce que vous recherchez, les expressions régulières sont une façon plus sûre d'y aller, car vous pouvez gérer aussi les structures non valides HTML / XHTML , qui échoueraient, si elles étaient chargées via la plupart des analyseurs.

40
répondu jancha 2014-03-31 22:48:43

I recommend PHP Simple HTML DOM Parser .

Il a vraiment des caractéristiques intéressantes, comme:

foreach($html->find('img') as $element)
       echo $element->src . '<br>';
37
répondu Greg 2015-10-28 17:42:57

cela ressemble à une bonne description de tâche de la technologie W3C XPath . Il est facile d'exprimer des requêtes comme "return all href dans les attributs img qui sont imbriqués dans <foo><bar><baz> elements ."N'étant pas un buff PHP, Je ne peux pas vous dire sous quelle forme XPath peut être disponible. Si vous pouvez appeler un programme externe pour traiter le fichier HTML, vous devriez être en mesure d'utiliser une version en ligne de commande de XPath. Pour une introduction rapide, voir http://en.wikipedia.org/wiki/XPath .

35
répondu Jens 2011-04-14 19:08:11

Tiers alternatives pour SimpleHtmlDom qui utilisent des DOM au lieu de traitement de Chaîne: phpQuery , Zend_Dom , QueryPath et FluentDom .

28
répondu Amal Murali 2013-12-26 18:31:35

Oui vous pouvez utiliser simple_html_dom à cette fin. Cependant, j'ai beaucoup travaillé avec le simple_html_dom, en particulier pour le scrapping web et je l'ai trouvé trop vulnérable. Il fait le travail de base, mais je ne le recommande pas de toute façon.

Je n'ai jamais utilisé curl dans ce but, mais ce que j'ai appris est que curl peut faire le travail beaucoup plus efficacement et est beaucoup plus solide.

veuillez vérifier ce lien: grattage-sites Web-avec-boucle

22
répondu Rafay 2013-06-14 10:40:04

QueryPath est bon, mais faites attention à "l'état de suivi" car si vous ne réalisez pas ce que cela signifie, cela peut signifier que vous perdez beaucoup de temps à débugger en essayant de découvrir ce qui s'est passé et pourquoi le code ne fonctionne pas.

ce que cela signifie est que chaque appel sur le jeu de résultats modifie le jeu de résultats dans l'objet, il n'est pas enchaînable comme dans jquery où chaque lien est un nouvel ensemble, vous avez un seul ensemble qui est les résultats de votre requête et chaque appel de la fonction modifie cela.

pour obtenir le comportement jquery-like, Vous devez se ramifier avant de faire un filtre/modifier comme opération, cela signifie qu'il va refléter ce qui se passe dans jquery beaucoup plus étroitement.

$results = qp("div p");
$forename = $results->find("input[name='forename']");

$results contient maintenant le résultat défini pour input[name='forename'] pas la requête originale "div p" cela m'a beaucoup fait trébuché, ce que j'ai trouvé était que QueryPath trace les filtres et trouve et tout ce qui modifie les résultats et les stocke dans l'objet. vous devez le faire à la place

$forename = $results->branch()->find("input[name='forname']")

puis $results ne seront pas modifiés et vous pouvez réutiliser le jeu de résultats encore et encore, peut-être quelqu'un avec beaucoup plus de connaissances peut clarifier cela un peu, mais il est fondamentalement comme cela de ce que j'ai trouvé.

22
répondu Christopher Thomas 2015-01-31 10:14:42

DOM Html avancé est un HTML simple DOM remplacement qui offre la même interface, mais il est DOM-basé qui signifie qu'aucun des problèmes de mémoire associés se produisent.

Il dispose également d'un support CSS complet, y compris jQuery extensions.

18
répondu pguardiario 2015-12-28 16:48:57

j'ai créé une bibliothèque nommée PHPPowertools/DOM-Query , qui vous permet de parcourir les documents HTML5 et XML comme vous le faites avec jQuery.

sous le capot, il utilise symfony/DomCrawler pour la conversion des sélecteurs CSS en XPath sélecteurs. Il utilise toujours le même DomDocument, même en passant un objet à un autre, pour assurer une performance.


exemple d'utilisation:

namespace PowerTools;

// Get file content
$htmlcode = file_get_contents('https://github.com');

// Define your DOMCrawler based on file string
$H = new DOM_Query($htmlcode);

// Define your DOMCrawler based on an existing DOM_Query instance
$H = new DOM_Query($H->select('body'));

// Passing a string (CSS selector)
$s = $H->select('div.foo');

// Passing an element object (DOM Element)
$s = $H->select($documentBody);

// Passing a DOM Query object
$s = $H->select( $H->select('p + p'));

// Select the body tag
$body = $H->select('body');

// Combine different classes as one selector to get all site blocks
$siteblocks = $body->select('.site-header, .masthead, .site-body, .site-footer');

// Nest your methods just like you would with jQuery
$siteblocks->select('button')->add('span')->addClass('icon icon-printer');

// Use a lambda function to set the text of all site blocks
$siteblocks->text(function( $i, $val) {
    return $i . " - " . $val->attr('class');
});

// Append the following HTML to all site blocks
$siteblocks->append('<div class="site-center"></div>');

// Use a descendant selector to select the site's footer
$sitefooter = $body->select('.site-footer > .site-center');

// Set some attributes for the site's footer
$sitefooter->attr(array('id' => 'aweeesome', 'data-val' => 'see'));

// Use a lambda function to set the attributes of all site blocks
$siteblocks->attr('data-val', function( $i, $val) {
    return $i . " - " . $val->attr('class') . " - photo by Kelly Clark";
});

// Select the parent of the site's footer
$sitefooterparent = $sitefooter->parent();

// Remove the class of all i-tags within the site's footer's parent
$sitefooterparent->select('i')->removeAttr('class');

// Wrap the site's footer within two nex selectors
$sitefooter->wrap('<section><div class="footer-wrapper"></div></section>');

[...]

méthodes prises en charge :


  1. renommé "select", pour des raisons évidentes
  2. renommé "void", car "empty" est un mot réservé en PHP

NOTE :

La bibliothèque comprend également son propre autoloader zero-configuration pour les bibliothèques compatibles PSR-0. L'exemple inclus devrait travailler hors de la boîte, sans aucune configuration supplémentaire. Alternativement, vous pouvez l'utiliser avec le compositeur.

17
répondu John Slegers 2016-02-21 16:05:36

j'ai écrit un analyseur XML universel qui peut facilement traiter les fichiers GB. Il est basé sur XMLReader et il est très facile à utiliser:

$source = new XmlExtractor("path/to/tag", "/path/to/file.xml");
foreach ($source as $tag) {
    echo $tag->field1;
    echo $tag->field2->subfield1;
}

voici le GitHub repo: XmlExtractor

16
répondu Paul Warelis 2013-05-12 01:23:11

pour HTML5 , HTML5 lib a été abandonné depuis des années maintenant. La seule bibliothèque HTML5 que je peux trouver avec une mise à jour récente et des dossiers de maintenance est html5-php qui a été apporté à beta 1.0 il y a un peu plus d'une semaine.

16
répondu Reid Johnson 2015-10-28 17:43:39

vous pouvez essayer d'utiliser quelque chose comme HTML Tidy pour nettoyer n'importe quel HTML" cassé " et convertir le HTML en XHTML, que vous pouvez ensuite Parser avec un analyseur XML.

14
répondu CesarB 2008-11-15 22:24:15

une autre option que vous pouvez essayer est QueryPath . Il est inspiré par jQuery, mais sur le serveur dans PHP et utilisé dans Drupal .

13
répondu Richard Le Poidevin 2014-03-31 22:47:49

XML_HTMLSax est plutôt stable - même si elle n'est plus entretenue. Une autre option pourrait être de vous Piper HTML par HTML Tidy et puis de le parser avec des outils XML standard.

11
répondu troelskn 2008-11-15 19:55:44

le Symfony framework dispose de faisceaux qui peuvent Parser le HTML, et vous pouvez utiliser le style CSS pour sélectionner le DOMs au lieu d'utiliser XPath .

11
répondu Tuong Le 2014-03-31 22:49:29

il existe de nombreuses façons de traiter le DOM HTML/XML dont la plupart ont déjà été mentionnées. Par conséquent, je n'essaierai pas de les énumérer moi-même.

je veux simplement ajouter que je préfère personnellement utiliser L'extension DOM et pourquoi:

  • iit permet une utilisation optimale de l'avantage de performance du sous-jacent code C
  • c'est OO en PHP (et me permet à la sous-classe)
  • c'est assez bas niveau (qui me permet de l'utiliser comme une base non gonflée pour un comportement plus avancé)
  • il donne accès à toutes les parties de la DOM (à la différence par exemple. SimpleXml, qui ignore certaines des fonctionnalités XML moins connues)
  • il a une syntaxe utilisée pour DOM crawling qui est similaire à la syntaxe utilisée dans Javascript natif.

et bien que je manque la possibilité d'utiliser des sélecteurs CSS pour DOMDocument , il y a un une façon pratique d'ajouter cette caractéristique: sous -classer les méthodes DOMDocument et ajouter les méthodes querySelectorAll et querySelector de type JS à votre sous-classe.

pour l'analyse des sélecteurs, je recommande d'utiliser le très minimaliste cssselector component du Symfony framework . Ce composant ne fait que traduire les sélecteurs CSS en sélecteurs XPath, qui peuvent ensuite être introduits dans un DOMXpath pour récupérer le Nodelist correspondant.

vous pouvez alors utiliser cette sous-classe (encore de très bas niveau) comme base pour des classes de plus haut niveau, destinées par exemple à: analysez des types très spécifiques de XML ou ajoutez un comportement similaire à jQuery.

le code ci-dessous sort directement de ma DOM-Bibliothèque D'interrogation et utilise la technique que j'ai décrite.

Pour l'analyse HTML :

namespace PowerTools;

use \Symfony\Component\CssSelector\CssSelector as CssSelector;

class DOM_Document extends \DOMDocument {
    public function __construct($data = false, $doctype = 'html', $encoding = 'UTF-8', $version = '1.0') {
        parent::__construct($version, $encoding);
        if ($doctype && $doctype === 'html') {
            @$this->loadHTML($data);
        } else {
            @$this->loadXML($data);
        }
    }

    public function querySelectorAll($selector, $contextnode = null) {
        if (isset($this->doctype->name) && $this->doctype->name == 'html') {
            CssSelector::enableHtmlExtension();
        } else {
            CssSelector::disableHtmlExtension();
        }
        $xpath = new \DOMXpath($this);
        return $xpath->query(CssSelector::toXPath($selector, 'descendant::'), $contextnode);
    }

    [...]

    public function loadHTMLFile($filename, $options = 0) {
        $this->loadHTML(file_get_contents($filename), $options);
    }

    public function loadHTML($source, $options = 0) {
        if ($source && $source != '') {
            $data = trim($source);
            $html5 = new HTML5(array('targetDocument' => $this, 'disableHtmlNsInDom' => true));
            $data_start = mb_substr($data, 0, 10);
            if (strpos($data_start, '<!DOCTYPE ') === 0 || strpos($data_start, '<html>') === 0) {
                $html5->loadHTML($data);
            } else {
                @$this->loadHTML('<!DOCTYPE html><html><head><meta charset="' . $encoding . '" /></head><body></body></html>');
                $t = $html5->loadHTMLFragment($data);
                $docbody = $this->getElementsByTagName('body')->item(0);
                while ($t->hasChildNodes()) {
                    $docbody->appendChild($t->firstChild);
                }
            }
        }
    }

    [...]
}

Voir aussi Parsing XML documents with CSS sélecteurs par le créateur de Symfony Fabien Potencier sur sa décision de créer le composant CssSelector pour Symfony et comment l'utiliser.

10
répondu John Slegers 2016-01-15 16:02:29

avec FluidXML vous pouvez interroger et itérer XML en utilisant XPath et CSS Selectors .

$doc = fluidxml('<html>...</html>');

$title = $doc->query('//head/title')[0]->nodeValue;

$doc->query('//body/p', 'div.active', '#bgId')
        ->each(function($i, $node) {
            // $node is a DOMNode.
            $tag   = $node->nodeName;
            $text  = $node->nodeValue;
            $class = $node->getAttribute('class');
        });

https://github.com/servo-php/fluidxml

9
répondu Daniele Orlando 2016-03-07 16:44:44

il y a plusieurs raisons de ne pas analyser HTML par expression régulière. Mais, si vous avez le contrôle total de ce que HTML sera généré, alors vous pouvez faire avec l'expression régulière simple.

au-dessus c'est une fonction qui parse HTML par expression régulière. Notez que cette fonction est très sensible et exige que le HTML obéisse à certaines règles, mais elle fonctionne très bien dans de nombreux scénarios. Si vous voulez un simple analyseur, et que vous ne voulez pas installer de bibliothèques, tentez votre chance.:

function array_combine_($keys, $values) {
    $result = array();
    foreach ($keys as $i => $k) {
        $result[$k][] = $values[$i];
    }
    array_walk($result, create_function('&$v', '$v = (count($v) == 1)? array_pop($v): $v;'));

    return $result;
}

function extract_data($str) {
    return (is_array($str))
        ? array_map('extract_data', $str)
        : ((!preg_match_all('#<([A-Za-z0-9_]*)[^>]*>(.*?)</>#s', $str, $matches))
            ? $str
            : array_map(('extract_data'), array_combine_($matches[1], $matches[2])));
}

print_r(extract_data(file_get_contents("http://www.google.com/")));
7
répondu Daniel Loureiro 2015-10-28 17:45:41

JSON et array de XML en trois lignes:

$xml = simplexml_load_string($xml_string);
$json = json_encode($xml);
$array = json_decode($json,TRUE);

Ta da!

6
répondu Antonio Max 2015-10-28 17:44:03

j'ai créé une bibliothèque appelée HTML5DOMDocument qui est disponible gratuitement à https://github.com/ivopetkov/html5-dom-document-php

il soutient des sélecteurs de requête trop que je pense sera extrêmement utile dans votre cas. Voici un exemple de code:

$dom = new IvoPetkov\HTML5DOMDocument();
$dom->loadHTML('<!DOCTYPE html><html><body><h1>Hello</h1><div class="content">This is some text</div></body></html>');
echo $dom->querySelector('h1')->innerHTML;
2
répondu Ivo Petkov 2017-12-21 08:38:33

si vous êtes familier avec le sélecteur jQuery, vous pouvez utiliser ScarletsQuery pour PHP

<pre><?php
include "ScarletsQuery.php";

// Load the HTML content and parse it
$html = file_get_contents('https://www.lipsum.com');
$dom = Scarlets\Library\MarkupLanguage::parseText($html);

// Select meta tag on the HTML header
$description = $dom->selector('head meta[name="description"]')[0];

// Get 'content' attribute value from meta tag
print_r($description->attr('content'));

$description = $dom->selector('#Content p');

// Get element array
print_r($description->view);

cette bibliothèque prend habituellement moins de 1 seconde pour traiter le html hors ligne.

Il accepte également les attributs HTML invalides ou les guillemets manquants.

0
répondu StefansArya 2018-08-16 12:35:01