Maison > Questions et réponses > le corps du texte
Comment analyser HTML/XML et en extraire des informations ?
P粉5556967382023-10-12 19:20:54
Essayez Simple HTML DOM Parser.
Remarque : comme son nom l'indique, il est utile pour les tâches simples. Il utilise des expressions régulières au lieu d'un analyseur HTML, il sera donc beaucoup plus lent pour les tâches plus complexes. La majeure partie de sa base de code a été écrite en 2008, avec seulement des améliorations mineures apportées depuis. Il ne suit pas les normes de codage PHP modernes et est difficile à intégrer dans des projets modernes conformes au PSR.
// 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>';
// 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;
// Dump contents (without tags) from HTML echo file_get_html('http://www.google.com/')->plaintext;
// 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);
P粉1158400762023-10-12 17:24:06
Je préfère utiliser l'une des extensions XML natives car elles fonctionnent avec PHP généralement plus rapidement que toutes les bibliothèques tierces et me donnent tout le contrôle dont j'ai besoin sur le balisage.
DOM est capable d'analyser et de modifier le HTML (cassé) du monde réel, il peut effectuer des requêtes XPath< /a> Il est basé sur libxml.
Travailler avec DOM prend un certain temps pour devenir productif, mais à mon avis, cela en vaut la peine. Étant donné que DOM est une interface neutre en termes de langage, vous trouverez des implémentations dans plusieurs langages. Par conséquent, si vous devez changer de langage de programmation, vous savez probablement déjà comment utiliser l'API DOM de ce langage.
Comment utiliser les extensions DOM a été largement couvert sur StackOverflow, donc si et quand vous choisissez de l'utiliser, vous pouvez être sûr que la plupart des problèmes que vous rencontrez peuvent être résolus en recherchant/parcourant Stack Overflow.
Des exemples d'utilisation de baseet Aperçu général du conceptpeuvent être trouvés dans d'autres réponses.
XMLReader, comme DOM, est basé sur libxml. Je ne sais pas comment déclencher le module d'analyseur HTML, donc utiliser XMLReader pour analyser du HTML corrompu n'est peut-être pas aussi puissant que l'utilisation d'un DOM, où vous pouvez lui dire explicitement d'utiliser le module d'analyseur HTML de libxml.
Un exemple d'utilisation de base est fourni dans une autre réponse.
Des exemples d'utilisation de base
sont fournis, et il y en a bien d'autres dans le manuel PHP. Si vous préférez utiliser une bibliothèque tierce, je vous recommande d'utiliser DOM/libxml ci-dessous au lieu de l'analyse de chaînes. Ceci est décrit comme « Logiciels abandonnés et bugs : utilisez-les à vos propres risques » mais semble être peu entretenu. L'avantage de construire sur DOM/libxml est que vous obtenez de bonnes performances dès le départ car vous construisez sur des extensions natives. Cependant, toutes les bibliothèques tierces ne suivent pas cette voie. Certains d'entre eux sont répertoriés ci-dessous Je ne recommande généralement pas cet analyseur. La base de code est épouvantable et l'analyseur lui-même est assez lent et gourmand en mémoire. Tous les sélecteurs jQuery (tels que sous-sélecteurs) ne sont pas possibles. Toute bibliothèque basée sur libxml devrait facilement surpasser cela. Encore une fois, je ne recommanderais pas cet analyseur. Assez lent lorsque l'utilisation du processeur est élevée. 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 graves dans les boucles imbriquées. Le document lui-même est inexact et contient des fautes d’orthographe, et aucune réponse corrective n’a été reçue depuis le 14 avril 2016. Vous pouvez utiliser ce qui précède pour analyser HTML5, mais des choses étranges peuvent se produire en raison du balisage autorisé par HTML5. Par conséquent, pour HTML5, vous souhaiterez peut-être envisager d’utiliser un analyseur dédié. Notez que ceux-ci sont écrits en PHP, donc les performances seront plus lentes et l'utilisation de la mémoire augmentée par rapport aux extensions compilées avec des langages de niveau inférieur. Dernier et le moins recommandé, vous pouvez utiliser des expressions régulièrespour extraire des données du HTML a >. En général, l'utilisation d'expressions régulières sur HTML est déconseillée. La plupart des extraits de code que vous trouvez sur le Web pour les balises correspondantes sont fragiles. Dans la plupart des cas, ils ne fonctionnent qu’avec des extraits HTML très spécifiques. De petites modifications de balisage (telles que l'ajout d'un espace quelque part, ou l'ajout ou la modification d'un attribut dans le balisage) peuvent entraîner l'échec d'une expression régulière lorsqu'elle est mal écrite. Avant d'utiliser RegEx sur HTML, vous devez savoir ce que vous faites. L'analyseur HTML connaît déjà les règles de syntaxe du HTML. Les expressions régulières doivent être enseignées pour chaque nouvelle expression régulière que vous écrivez. Les expressions régulières sont utiles dans certains cas, mais cela dépend vraiment de votre cas d'utilisation. Vous pourriez écrire un analyseur plus fiable , mais écrire un analyseur personnalisé complet et fiable utilisant des expressions régulières est une perte de temps lorsque les bibliothèques ci-dessus existent déjà et font un bien meilleur travail dans ce domaine. Voir aussiAnalyse de la voie Cthulhu Html< /a> Si vous voulez dépenser de l'argent, vous pouvez le vérifier Je ne suis pas affilié à des architectes ou à des auteurs PHP.
Bibliothèque tierce (basée sur libxml)
FluentDom
HtmlPageDom
phpQuery
laminas-dom
fDOMDocument
sabre/xml
FluidXML
Tiers (non basé sur libxml)
Parseur DOM HTML simple PHP
Parseur HTML PHP
HTML5
Document HTML5Dom
HTML5
Expressions régulières
Livres