Si vous devez analyser le code HTML, les expressions régulières ne sont pas la solution. Dans ce didacticiel, vous apprendrez à utiliser un analyseur syntaxique à code source ouvert, facile à apprendre, pour lire, modifier et décomposer du HTML à partir de sources externes. En prenant exemple sur nettuts, vous apprendrez à obtenir une liste de tous les articles publiés sur le site et à les afficher..
En passant, vous pouvez également trouver des analyseurs sur Envato Market, tels que HTML5 Parser.
Analyseur HTML5 sur le marché EnvatoLa première chose à faire est de télécharger une copie de la bibliothèque simpleHTMLdom, disponible gratuitement sur sourceforge.
Le téléchargement contient plusieurs fichiers, mais le seul dont vous avez besoin est le fichier simple_html_dom.php. le reste sont des exemples et de la documentation.
Cette bibliothèque est très facile à utiliser, mais il y a quelques bases que vous devriez revoir avant de la mettre en action..
$ html = new simple_html_dom (); // Charger depuis une chaîne $ html-> load ('Bonjour le monde!
Nous sommes ici
'); // Charge un fichier $ html-> load_file ('http://net.tutsplus.com/');
Vous pouvez créer votre objet initial en chargeant HTML à partir d'une chaîne ou d'un fichier. Le chargement d'un fichier peut s'effectuer soit via une URL, soit via votre système de fichiers local..
Attention: la méthode load_file () délègue son travail au fichier_get_contents de PHP. Si allow_url_fopen n'est pas défini sur true dans votre fichier php.ini, il se peut que vous ne puissiez pas ouvrir un fichier distant de cette façon. Vous pouvez toujours utiliser la bibliothèque CURL pour charger des pages distantes dans ce cas, puis les lire avec la méthode load ().
Une fois que vous avez votre objet DOM, vous pouvez commencer à le manipuler en utilisant find () et en créant des collections. Une collection est un groupe d'objets trouvés via un sélecteur - la syntaxe est assez similaire à celle de jQuery..
Bonjour le monde!
Nous sommes ici.
Dans cet exemple HTML, nous allons voir comment accéder aux informations du deuxième paragraphe, les modifier, puis afficher les résultats..
# créer et charger le HTML include ('simple_html_dom.php'); $ html = new simple_html_dom (); $ html-> load ("Bonjour le monde!
Nous sommes ici
"); # récupère un élément représentant le deuxième paragraphe $ element = $ html-> find (" p "); # le modifie $ element [1] -> innertext. =" et nous sommes là pour rester. "; # la sortie! echo $ html-> save ();
L'utilisation de la méthode find () renvoie toujours une collection (tableau) de balises, sauf si vous indiquez que vous souhaitez uniquement le nième enfant, en tant que second paramètre..
Lignes 2-4: Charge le code HTML à partir d'une chaîne, comme expliqué précédemment.
Ligne 7: Cette ligne trouve tout
balises dans le code HTML et les renvoie sous forme de tableau. Le premier paragraphe aura un index de 0 et les paragraphes suivants seront indexés en conséquence.
ligne 10: Ceci accède au 2e élément de notre collection de paragraphes (index 1) et ajoute un complément à son attribut innertext. Innertext représente le contenu entre les balises, tandis que outertext représente le contenu, y compris la balise. Nous pourrions remplacer entièrement la balise en utilisant outertext.
Nous allons ajouter une ligne supplémentaire et modifier la classe de notre deuxième balise de paragraphe.
$ element [1] -> class = "class_name"; echo $ html-> save ();
Le code HTML résultant de la commande de sauvegarde serait:
Bonjour le monde!
Nous sommes là et nous sommes là pour rester.
Voici quelques autres exemples de sélecteurs. Si vous avez utilisé jQuery, cela vous semblera très familier.
# obtenir la première occurrence de $ single = $ html-> find ('# foo', 0); # récupère tous les éléments avec $ collection = $ html-> find ('. foo'); # récupère toutes les balises d'ancrage sur une page $ collection = $ html-> find ('a'); # récupère toutes les balises d'ancrage contenues dans les balises H1 $ collection = $ html-> find ('h1 a'); # récupère toutes les balises img dont le titre est 'himom' $ collection = $ html-> find ('img [title = himom]');
Le premier exemple n'est pas totalement intuitif: toutes les requêtes, par défaut, renvoient des collections, même une requête ID, qui ne devrait renvoyer qu'un seul résultat. Cependant, en spécifiant le deuxième paramètre, nous disons "ne renvoie que le premier élément de cette collection".
Cela signifie que $ single est un élément unique, plutôt qu'un tableau d'éléments avec un élément.
Les autres exemples sont explicites.
Une documentation complète sur la bibliothèque est disponible sur la page de documentation du projet..
Pour mettre cette bibliothèque en action, nous allons écrire un script rapide pour extraire le contenu du site Web Nettuts, et produire une liste des articles présents sur le site par titre et description… seulement à titre d'exemple. Le grattage est une zone délicate du Web et ne doit pas être effectué sans autorisation..
include ('simple_html_dom.php'); $ articles = array (); getArticles ('http://net.tutsplus.com/page/76/');
Nous commençons par inclure la bibliothèque et en appelant la fonction getArticles avec la page que nous aimerions commencer à analyser. Dans ce cas, nous commençons vers la fin et aimons le serveur de Nettuts.
Nous déclarons également un tableau global afin de simplifier la collecte de toutes les informations sur l'article au même endroit. Avant de commencer l'analyse, examinons comment un résumé d'article est décrit sur Nettuts.+.
Cela représente un format de publication de base sur le site, y compris les commentaires de code source. Pourquoi les commentaires sont-ils importants? Ils comptent comme des noeuds à l'analyseur.
fonction getArticles ($ page) global $ articles; $ html = new simple_html_dom (); $ html-> load_file ($ page); //… plus…
Nous commençons très simplement en réclamant notre global, en créant un nouvel objet simple_html_dom, puis en chargeant la page que nous voulons analyser. Cette fonction s'appellera plus tard, nous la configurons pour accepter l'URL en tant que paramètre..
$ items = $ html-> find ('div [class = preview]'); foreach ($ items as $ post) # mémoriser les commentaires comptent comme nœuds $ articles [] = array ($ post-> enfants (3) -> outertext, $ post-> enfants (6) -> first_child () -> outertext )
C'est la base de la fonction getArticles. Il va regarder de plus près pour vraiment comprendre ce qui se passe.
Ligne 1: Crée un tableau d'éléments - les div avec la classe de prévisualisation. Nous avons maintenant une collection d'articles stockés dans $ items.
Ligne 5: $ post fait maintenant référence à une seule div de la prévisualisation de la classe. Si nous regardons le code HTML d'origine, nous pouvons voir que le troisième enfant est le H1 contenant le titre de l'article. On prend ça et on l'assigne à $ articles [index] [0].
N'oubliez pas de commencer à 0 et de compter les commentaires lorsque vous essayez de déterminer le bon index d'un nœud enfant.
Ligne 6: Le sixième enfant de $ post est
$ articles [0] [0] = "Mon nom d'article ici"; $ articles [0] [1] = "Ceci est la description de mon article"
La première chose à faire est de déterminer comment trouver notre page suivante. Sur Nettuts +, les URL sont faciles à comprendre, mais nous allons prétendre qu'elles ne le sont pas et obtenir le lien suivant via l'analyse.
Si nous regardons le HTML, nous voyons ce qui suit:
"
S'il y a une page suivante (et il n'y en aura pas toujours), nous trouverons une ancre avec la classe de 'nextpostslink'. Maintenant, cette information peut être utilisée.
if ($ next = $ html-> find ('a [class = nextpostslink]', 0)) $ URL = $ next-> href; $ html-> clear (); non défini ($ html); getArticles ($ URL);
Sur la première ligne, nous voyons si nous pouvons trouver une ancre avec la classe nextpostslink. Prenez note du second paramètre pour find (). Cela spécifie que nous voulons seulement que le premier élément (index 0) de la collection trouvée soit retourné. $ next ne contiendra qu'un seul élément, plutôt qu'un groupe d'éléments.
Ensuite, nous assignons le HREF du lien à la variable $ URL. Ceci est important car nous sommes sur le point de détruire l'objet HTML. En raison d'une fuite de mémoire des références circulaires php5, l'objet simple_html_dom actuel doit être effacé et non défini avant qu'un autre ne soit créé. Sinon, vous risquez de perdre toute votre mémoire disponible.
Enfin, nous appelons getArticles avec l'URL de la page suivante. Cette récurrence se termine lorsqu'il n'y a plus de pages à analyser.
Nous allons d’abord définir quelques styles de base. C'est complètement arbitraire - vous pouvez donner à votre sortie l'apparence que vous souhaitez.
#main margin: 80px auto; largeur: 500px; h1 police: gras 40px / 38px helvetica, verdana, sans-serif; marge: 0; h1 a color: # 600; texte-décoration: aucun; p background: #ECECEC; police: 10px / 14px verdana, sans-serif; marge: 8px 0 15px; bordure: 1px #CCC solide; rembourrage: 15px; .item padding: 10px;
Ensuite, nous allons mettre un peu de PHP dans la page pour afficher les informations précédemment stockées..
"; echo $ item [0]; echo $ item [1]; echo"
Le résultat final est une seule page HTML répertoriant tous les articles, en commençant par la page indiquée par le premier appel à getArticles ()..
Si vous analysez beaucoup de pages (par exemple, le site entier), le temps d'exécution maximal autorisé par votre serveur peut être plus long. Par exemple, s’exécutant à partir de mon ordinateur local, il faut environ une seconde par page (temps de récupération compris)..
Sur un site tel que Nettuts, avec 78 didacticiels en cours, la durée de cette dernière serait supérieure à une minute..
Ce tutoriel devrait vous aider à utiliser l’analyse HTML. Il existe d’autres méthodes pour travailler avec le DOM, y compris celle de PHP, qui vous permet de travailler avec de puissants sélecteurs xpath pour trouver des éléments. Pour faciliter l’utilisation et démarrer rapidement, je trouve cette bibliothèque l’une des meilleures. En guise de conclusion, pensez toujours à obtenir la permission avant de supprimer un site. c'est important. Merci d'avoir lu!