Les bases pour parser le contenu d’un site avec Simple HTML DOM Parser
Simple HTML DOM Parser
Avec la librairie jQuery, il est très facile de parser le DOM d’une source pour récupérer le contenu d’éléments ciblés. En PHP, pour manipuler une source HTML, ce n’est pas forcément très pratique. On peut le faire en enchaînant les expressions régulières mais cela devient vite long et laborieux. Et bien sachez qu’il existe la classe Simple HTML DOM Parser qui permet de sélectionner des éléments de l’arbre DOM à l’aide de sélecteurs, comme il est possible de le faire avec jQuery.
1 – Prérequis
Simple HTML DOM Parser est une classe qui requiert au minimum l’utilisation de PHP 5. Si vous possédez un serveur avec une version atérieure, il est temps de le mettre à jour ! Autre point sensible : une méthode de la classe fait appel à la fonction file_get_contents de PHP.
Si la directive allow_url_fopen a la valeur false dans votre fichier « php.ini », vous ne serez pas en mesure de récupérer le contenu d’un fichier distant.
Pour remédier au problème, il faut mettre la valeur à true.
2 – Télécharger simple HTML DOM Parser
La première chose à faire est de se procurer la classe Simple HTML DOM Parser disponible gratuitement en téléchargement à partir de l’adresse suivante : http://sourceforge.net/projects/simplehtmldom/files/. Après avoir décompressé l’archive, il faut récupérer le fichier nommé « simple_html_dom.php » qui correspond à la classe.
Le reste (dossiers et fichiers) correspond à des exemples et à de la documentation qui ne sont pas nécessaires. La documentation de Simple HTML DOM Parser est disponible à l’adresse suivant : http://simplehtmldom.sourceforge.net/manual.html.
3 – Récupérer le contenu d’une source – méthode rapide
Simple HTML DOM Parser permet de récupérer le contenu d’une source à l’aide de deux méthodes. La première consiste à utiliser la fonction file_get_html(). Il suffit de préciser une URL ou un fichier en argument pour obtenir une instance de la classe file_html_dom. Pour récupérer le contenu à partir d’une adresse URL :
$html = file_get_html('http://petit-dev.com');
Pour récupérer le contenu à partir d’un fichier :
$html = file_get_html('script.html');
4 – Récupérer le contenu d’une source – méthode objet
La deuxième méthode pour récupérer le contenu d’une source est de faire une instance de la classe simple_html_dom puis de charger le contenu grâce à la méthode load_file(). Ce procédé est plus propre et plus performant que la méthode rapide.
Pour faire une instance de l’objet : $html = new simple_html_dom();
Pour charger le contenu à partir d’une adresse URL : $html->load_file('http://petit-dev.com');
Charger le contenu à partir d’un fichier : $html->load_file('script.html');
A savoir : il est possible de charger votre propre contenu à partir de la méthode load().
$html->load('<p>Mon contenu</p>');
5 – Les sélecteurs
Si vous utilisez jQuery, le terme « sélecteur » devrait vous être familier. En effet, Simple HTML DOM Parser possède la méthode find() qui permet de trouver n’importe quel élément HTML par sa classe, son identifiant, son tag ou tout autre sélecteur. Voici quelques exemples qui permettent de récupérer une collection d’éléments à l’aide de la méthode find() et de divers sélecteurs. Pour récupérer l’élément ayant comme ID « foo » :
$single = $html->find('#foo', 0);
Pour récupérer tous les éléments ayant comme classe foo :
$collection = $html->find('.foo');
Pour récupérer tous les liens de la source :
$collection = $html->find('a');
Pour récupérer tous les liens et toutes les images de la source :
$collection = $html->find('a,img');
Pour récupérer tous les liens présents dans un « h1″ : $collection = $html->find('h1 a');
Pour récupérer toutes les images dont l’attribut : width est égal à 300 :
$collection = $html->find('img[width=300]');
6 – Récupérer un élément d’une collection
Le premier exemple de sélection mérite quelques explications.
Par défaut, la méthode find() retourne un array composé d’objets correspondant à la collection que nous avons récupérée. Même si une requête sur un ID devrait fournir un résultat unique, le retour de la méthode sera tout de même un array. Toutefois, en spécifiant la valeur 0 comme second paramètre de la méthode find(), nous indiquons : « ne retournera que le premier élément de cette collection ». Voici un autre exemple ou l’on ne récupère que le troisième lien d’une source :
$collection = $html->find('a', 2);
Notez que l’index de sélection fonctionne comme celui d’un array, c’est à dire qu’on commence à 0 pour récupérer la première entrée.
7 – Parcourir l’ensemble des éléments
Dans le cas où nous ne préciserions par un deuxième argument à la méthode find(), elle retourne un array. Pour parcourir l’ensemble des éléments qui composent la collection, il suffit d’utiliser une boucle de type foreach. Voici un exemple :
$links = $html->find('a');
foreach($links as $e) {
// suite du traitement
}
8 – Récupérer les attributs d’un élément
Dès que vous avez récupéré un élément ou une collection d’éléments, la classe Simple HTML DOM Parser permet de récupérer les attributs d’un élément. Cela peut se faire de deux manières :
soit en utilisant le méthode getAttribute() et en précisant le nom de l’attribut comme argument (ex : $e->getAttibute($name);
), soit en utilisant un raccourci qui consiste à préciser directement l’attribut que nous souhaitons récupérer (ex : $e->attribute;
). Pour l’exemple suivant nous utiliseront la base de code suivante :
require_once('simple_html_dom.php');
$html = new simple_html_dom();
$html->load('<div id="foo"><a title="Wordpress" href="http://petit-dev.com"><strong>Wordpress</strong> sur Petit Dev</a>
<a title="PHP" href="http://petit-dev.com">Tout savoir sur <em>PHP</em></a>
<p>Le site internet de <span>Matthieu Petit</span> et <span>Petit Dev</span>.</p></div>
'
);
Pour afficher l’attribut « href » du premier lien, il faut ajouter le code suivant:
$link = $html->find('#foo a', 0);
$href = $link->getAttribute('href');
ou
$href = $link->href;
puis
echo $href;
Cette étape peut être simplifiée par :
echo $html->find('#foo a', 0)->href;
Le résultat affiché sur la page sera : « http://petit-dev.com ».
Voilà tout en ce qui concerne les bases de Simple HTML DOM Parser ! Il est bien évidemment possible de pousser un petit peu plus loin en modifiant, supprimant ou ajoutant les attributs d’un éléments etc… Parsez bien !