Analyser le HTML avec PHP avec DiDOM

De temps en temps, les développeurs doivent parcourir des pages Web pour obtenir des informations d’un site Web. Par exemple, supposons que vous travaillez sur un projet personnel dans lequel vous devez obtenir des informations géographiques sur les capitales de différents pays à partir de Wikipedia. Saisie manuelle prendrait beaucoup de temps. Cependant, vous pouvez le faire très rapidement en grattant la page Wikipedia à l'aide de PHP. Vous pourrez également analyser automatiquement le code HTML pour obtenir des informations spécifiques au lieu de parcourir l'intégralité du balisage manuellement..

Dans ce didacticiel, nous étudierons un analyseur HTML rapide et convivial, appelé DiDOM. Nous allons commencer par le processus d'installation, puis apprendre à extraire des informations de différents éléments d'une page Web à l'aide de différents types de sélecteurs tels que des balises, des classes, etc..

Installation et utilisation

Vous pouvez facilement installer DiDOM dans votre répertoire de projet en exécutant la commande suivante:

compositeur nécessite imangazaliev / didom

Une fois que vous avez exécuté la commande ci-dessus, vous pourrez charger du code HTML à partir d'une chaîne, d'un fichier local ou d'une page Web. Voici un exemple:

require_once ('vendor / autoload.php'); utilisez DiDom \ Document; $ document = new Document ($ washington_dc_html_string); $ document = new Document ('washington_dc.html', true); $ url = 'https://en.wikipedia.org/wiki/Washington,_D.C.'; $ document = nouveau document ($ url, true);

Lorsque vous décidez d'analyser le code HTML d'un document, celui-ci peut déjà être chargé et stocké dans une variable. Dans ce cas, vous pouvez simplement passer cette variable à Document() et DiDOM préparera la chaîne pour l'analyse.

Si le code HTML doit être chargé à partir d'un fichier ou d'une URL, vous pouvez le définir comme premier paramètre. Document() et définissez le second paramètre sur vrai.

Vous pouvez également créer un nouveau Document objet en utilisant nouveau document() sans aucun paramètre. Dans ce cas, vous pouvez appeler la méthode loadHtml () charger du HTML à partir d'une chaîne et loadHtmlFile () charger du HTML à partir d'un fichier ou d'une page Web.

Trouver des éléments HTML

La première chose à faire avant d'obtenir le code HTML ou le texte d'un élément est de rechercher l'élément lui-même. Le moyen le plus simple de le faire est d’utiliser simplement le trouver() méthode et passez le sélecteur CSS pour votre élément souhaité en tant que premier paramètre.

Vous pouvez également passer le XPath pour un élément en tant que premier paramètre de la trouver() méthode. Cependant, cela nécessite que vous passiez Requête :: TYPE_XPATH comme second paramètre.

Si vous souhaitez uniquement utiliser les valeurs XPath pour rechercher un élément HTML, vous pouvez simplement utiliser la commande xpath () méthode au lieu de passer Requête :: TYPE_XPATH comme second paramètre à trouver() à chaque fois.

Si DiDOM peut trouver des éléments qui correspondent au sélecteur CSS ou à l'expression XPATH passés, il retournera un tableau d'instances de DiDom \ Element. Si aucun élément n'est trouvé, il retournera un tableau vide.

Comme ces méthodes renvoient un tableau, vous pouvez accéder directement au nième élément correspondant en utilisant find () [n-1].

Un exemple

Dans l'exemple suivant, nous obtiendrons le code HTML interne de toutes les en-têtes de premier et de deuxième niveau de l'article Wikipedia sur Washington, D.C..

require_once ('vendor / autoload.php'); utilisez DiDom \ Document; $ document = new Document ('https://en.wikipedia.org/wiki/Washington,_D.C.', true); $ main_heading = $ document-> find ('h1.firstHeading') [0]; echo $ main_heading-> html (); $ sub_headings = $ document-> find ('h2'); foreach ($ sub_headings en tant que $ sub_heading) if ($ sub_heading-> text ()! == 'Voir aussi') echo $ sub_heading-> html ();  else pause; 

Nous commençons par créer un nouvel objet Document en passant l'URL de l'article Wikipedia sur Washington, D.C. Après cela, nous obtenons l'élément principal en-tête à l'aide de la commande trouver() méthode et le stocker à l'intérieur d'une variable appelée $ main_heading. Nous pourrons maintenant appeler différentes méthodes sur cet élément, comme texte(), innerHtml (), html (), etc.

Pour le titre principal, nous appelons simplement le html () méthode qui renvoie le code HTML de l’ensemble de l’en-tête. De même, nous pouvons obtenir le code HTML dans un élément particulier en utilisant le innerHtml () méthode. Parfois, vous serez plus intéressé par le contenu en texte brut d'un élément que par son code HTML. Dans ce cas, vous pouvez simplement utiliser le texte() méthode et être fait avec elle.

Les en-têtes de niveau deux divisent notre page Wikipedia en sections bien définies. Cependant, vous voudrez peut-être vous débarrasser de certaines de ces sous-positions telles que "Voir aussi", "Notes", etc..

Une façon de le faire serait de parcourir toutes les en-têtes de niveau deux et de vérifier la valeur renvoyée par texte() méthode. Nous sortons de la boucle si le texte de titre renvoyé est "Voir aussi".

Vous pouvez directement accéder au 4ème ou 6ème niveau deux titres en utilisant $ document-> find ('h2') [3] et $ document-> find ('h2') [5] respectivement.

Parcourir de haut en bas le DOM

Une fois que vous avez accès à un élément particulier, la bibliothèque vous permet de parcourir l'arborescence DOM de haut en bas pour accéder facilement à d'autres éléments..

Vous pouvez aller au parent d’un élément HTML en utilisant le parent() méthode. De même, vous pouvez accéder au frère suivant ou précédent d’un élément à l’aide de la touche nextSibling () et précédentSibling () les méthodes.

Il existe de nombreuses méthodes disponibles pour accéder aux enfants d'un élément DOM. Par exemple, vous pouvez accéder à un élément enfant particulier en utilisant le enfant (n) méthode. De même, vous pouvez accéder au premier ou au dernier enfant d’un élément particulier en utilisant le premier enfant() et dernier enfant() méthodes. Vous pouvez effectuer une boucle sur tous les enfants d'un élément DOM particulier à l'aide de la commande enfants () méthode.

Une fois que vous arrivez à un élément particulier, vous pourrez accéder à son code HTML, etc. en utilisant le html (), innerHtml (), et texte() les méthodes.

Dans l'exemple suivant, nous commençons par les éléments d'en-tête de niveau deux et continuons à vérifier si l'élément frère suivant contient du texte. Dès que nous trouvons un élément frère avec du texte, nous le sortons dans le navigateur..

require_once ('vendor / autoload.php'); utilisez DiDom \ Document; $ document = new Document ('https://en.wikipedia.org/wiki/Washington,_D.C.', true); $ sub_headings = $ document-> find ('h2'); pour ($ i = 1; $ i < count($sub_headings); $i++)  if($sub_headings[$i]->text ()! == 'Voir aussi') $ next_sibling = $ sub_headings [$ i] -> nextSibling (); while (! $ next_elem-> html ()) $ next_sibling = $ next_sibling-> nextSibling ();  echo $ next_elem-> html (). "
"; else pause;

Vous pouvez utiliser une technique similaire pour parcourir tous les éléments frères et ne générer le texte que s'il contient une chaîne particulière ou si l'élément frère est une balise de paragraphe, etc. Une fois que vous connaissez les bases, il est facile de trouver les bonnes informations..

Manipulation des attributs d'élément

La possibilité d'obtenir ou de définir la valeur d'attribut pour différents éléments peut s'avérer très utile dans certaines situations. Par exemple, nous pouvons obtenir la valeur du src attribut pour tous les img balises dans notre article Wikipedia en utilisant $ image_elem-> attr ('src'). De la même manière, vous pouvez obtenir la valeur de href attributs pour tous les une balises dans un document.

Il existe trois façons d'obtenir la valeur d'un attribut donné pour un élément HTML. Vous pouvez utiliser le getAttribute ('attrName') méthode et transmettez le nom de l'attribut qui vous intéresse en tant que paramètre. Vous pouvez également utiliser le attr ('attrName') méthode, qui fonctionne comme getAttribute (). Enfin, la bibliothèque vous permet également d’obtenir directement la valeur de l’attribut à l’aide de $ elem-> attrName. Cela signifie que vous pouvez obtenir la valeur du src attribuer un élément d'image directement en utilisant $ imageElem-> src.

require_once ('vendor / autoload.php'); utilisez DiDom \ Document; $ document = new Document ('https://en.wikipedia.org/wiki/Washington,_D.C.', true); $ images = $ document-> find ('img'); foreach ($ images en tant que $ image) echo $ image-> src. "
";

Une fois que vous avez accès au src attributs, vous pouvez écrire le code pour télécharger automatiquement tous les fichiers image. De cette façon, vous pourrez gagner beaucoup de temps.

Vous pouvez également définir la valeur d'un attribut donné en utilisant trois techniques différentes. Tout d'abord, vous pouvez utiliser le setAttribute ('attrName', 'attrValue') méthode pour définir la valeur de l'attribut. Vous pouvez également utiliser le attr ('attrName', 'attrValue') méthode pour définir la valeur de l'attribut. Enfin, vous pouvez définir la valeur d'attribut pour un élément donné à l'aide de $ Elem-> attrName = 'attrValue'.

Ajout, suppression et remplacement d'éléments

Vous pouvez également modifier le document HTML chargé à l'aide de différentes méthodes fournies par la bibliothèque. Par exemple, vous pouvez ajouter, remplacer ou supprimer des éléments de l’arborescence DOM à l’aide de la appendChild (), remplacer(), et retirer() les méthodes.

La bibliothèque vous permet également de créer vos propres éléments HTML afin de les ajouter au document HTML d'origine. Vous pouvez créer un nouvel objet Element en utilisant nouvel élément ('tagName', 'tagContent').

Gardez à l'esprit que vous obtiendrez un Erreur non capturée: classe 'Elément' introuvable erreur si votre programme ne contient pas la ligne utiliser DiDom \ Element avant l'instanciation de l'objet element.

Une fois que vous avez l'élément, vous pouvez soit l'ajouter à d'autres éléments du DOM à l'aide de la appendChild () méthode ou vous pouvez utiliser le remplacer() méthode permettant d’utiliser l’élément nouvellement instancié en remplacement d’un ancien élément HTML du document. L'exemple suivant devrait aider à clarifier davantage ce concept.

require_once ('vendor / autoload.php'); utilisez DiDom \ Document; utilisez DiDom \ Element; $ document = new Document ('https://en.wikipedia.org/wiki/Washington,_D.C.', true); // Cela entraînera une erreur. echo $ document-> find ('h2.test-heading') [0] -> html (). "\ n"; $ test_heading = new Element ('h2', 'Ceci est l'en-tête de test.'); $ test_heading-> class = 'test-heading'; $ document-> find ('h1') [0] -> replace ($ test_heading); echo $ document-> find ('h2.test-heading') [0] -> html (). "\ n";

Au départ, il n'y a pas h2 élément dans notre document avec la classe rubrique test. Par conséquent, nous continuerons à avoir une erreur si nous essayons d'accéder à un tel élément.

Après avoir vérifié qu’il n’existe aucun élément de ce type, nous créons un nouveau h2 élément et changer la valeur de son classe attribuer à rubrique test.

Après cela, nous remplaçons le premier h1 élément dans le document avec notre nouvellement créé h2 élément. En utilisant le trouver() méthode sur notre document à nouveau pour trouver le h2 rubrique avec classe rubrique test retournera un élément maintenant.

Dernières pensées

Ce tutoriel couvrait les bases de l'analyseur HTML DiDOM HTML. Nous avons commencé par l’installation, puis nous avons appris à charger le code HTML à partir d’une chaîne, d’un fichier ou d’une URL. Après cela, nous avons expliqué comment trouver un élément particulier en fonction de son sélecteur CSS ou XPath. Nous avons également appris comment obtenir les frères et soeurs, les parents ou les enfants d'un élément. Le reste des sections couvrent la façon dont nous pouvons manipuler les attributs d'un élément particulier ou ajouter, supprimer et remplacer des éléments dans un document HTML..

.