Seohackers netlinking

Php Scraping avec fonctions DOM et Xpath

Ecrit par lemoussel le Lundi 25 janvier 2010 à 22:15 - Catégorie Scraping,Scripts PHP

Nous avons vu dans nos différents articles comment extraire/parser le contenu d’une page en utilisant les expressions régulières. La difficulté de cette approche est la maitrise de la rédaction des expressions régulières.

Dans cet article, je vous propose d’essayer une autre méthode par l’utilisation des fonctions DOMDocument et DOMXPath de PHP 5.

La question qui se pose alors : Comment déterminer la structure DOM d’un document HTML ?  Cela ne va t’il pas être plus compliqué que les expressions régulières ?

La réponse est non ! En effet avec le plug-in Firebug pour FireFox, l’exploration de la structure DOM d’une page HTML est très simple. Pour ce faire, nous allons reprendre l’exemple d’extraction des  backlinks référencés par Alexa avec le petit blog de geektitude Insolite du Geek.

Sous FireBug, il suffit de sélectionner la première URL (1), le chemin Xpath s’affiche alors (2). Il nous suffit “Copier le chemin XPath” (3).

Nous obtenons le chemin XPath (2) suivant :  /html/body/div/div/div[3]/div/div/div/div/div/ol/li/div/p/a

Et voilà le plus dur est fait ! Il suffit juste d’intégrer la requête XPath dans le script PHP suivant :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>Scraping avec DOMDocument & DOMXpath</title>
</head>
<body>
<?php
// Alexa Sites Linking to Insolite-du-Geek
$url = 'http://www.alexa.com/site/linksin;0/www.insolite-du-geek.fr';
$queryXPath = '/html/body/div/div/div[3]/div/div/div/div/div/ol/li/div/p/a';
 
$dom = new DOMDocument();
@$dom->loadHTMLFile($url);
$x = new DOMXPath($dom);
$nodeList = $x->query($queryXPath );
foreach ($nodeList as $node) 
	echo utf8_decode(urldecode($node->nodeValue))."<br/>";
?>
</body>
</html>

7 lignes de code PHP pour réaliser un scraping de page HTML.

Remarques :

  1. Noter la présence du @ devant la fonction loadHTMLFile(). Cela évite d’avoir les messages de Warning PHP de défaut de structure DOM du document HTML.
  2. J’ai remarqué que dans certains cas Firebug, insére pour la balise <table> la balise <tbody>. Cette balise n’étant pas présente dans le document, il faut la supprimer de la requête XPath sinon aucun résultat ne sera obtenu.

Sources :

W3C Recommendation : XPath 1.0 standard

Plus d’informations sur XPath : Xpath Tutorial

Commentaires (16)

Catégorie: Scraping,Scripts PHP


16 Commentaires

Commentaire par lejustebon

Lundi, 25 janvier , 2010 à 23:47

Purée ! Je ne comprends rien, c’est de la science fiction pour moi, mais avec un peu d’entrainement ça devrait venir ;)

Commentaire par Morgan

Mardi, 26 janvier , 2010 à 11:02

Encore et toujours du très lourd avec mister lemoussel ^^ Chapeau!

Commentaire par Nicolas

Mardi, 26 janvier , 2010 à 12:01

Et pour faire l’inverse (construire du HTML via XPath) : http://code.google.com/p/zen-coding/

Commentaire par Nicolas 2 ^^

Mardi, 26 janvier , 2010 à 12:27

Je n’arrive pas à récupérer par exemple seulement les « titres » de google vidéo sur une requete.

Est-ce que ca peut venir de la structure html ? (sorte d’anti dom)

Et seconde question, comment peut t’on récupérer plusieurs éléments en meme temps sur la même boucle ?

Merci beaucoup pour ce tuto !

Commentaire par Art

Mardi, 26 janvier , 2010 à 13:05

Merci pour le script.
Y a quelque chose à faire au niveau de la config de php?
J’obtiens ce message : Cannot clone object of class DOMDocument due to ‘zend.ze1_compatibility_mode’

Commentaire par Superrefman Gwaradenn

Mardi, 26 janvier , 2010 à 13:32

Merci beaucoup, j’avais bien firebug, mais jamais je ne l’aurais utilisé comme ça. :p

Commentaire par Rudy

Mardi, 26 janvier , 2010 à 13:59

Merci pour ce petit court, je connaissais de nom mais ne savais pas ce qu’était le DOM.

Je serais très friand d’autres tuto de ce type.

Commentaire par lemoussel

Mardi, 26 janvier , 2010 à 18:35

@Nicolas 2 ^^ : Il faut bien lire ce Tuto. Entre autre les remarques !
En effet les « titres » de google vidéo, sont dans des balises et comme je l’indique Firebug rajoute des balises qu’il faut supprimer si elles sont non présente dans la structure DOM de la page HTML. Ce qui estle cas içi

Pour les « titres » de google vidéo le XPath original est :
/html/body/div[7]/div/table[2]/tbody/tr/td/div/div/table/tbody/tr/td/div/div[2]/a
qui après suppression des balises devient :
/html/body/div[7]/div/table[2]/tr/td/div/div/table/tr/td/div/div[2]/a

Pour obtenir les « titres » de google vidéo, on a donc

$url = 'http://video.google.fr/';
$queryXPath = '/html/body/div[7]/div/table[2]/tr/td/div/div/table/tr/td/div/div[2]/a';

@Art : Normalement c’est natif en PHP 5.
zend.ze1_compatibility_mod est une directive PHP pour activer Active le mode de compatibilité avec le Zend Engine 1 (PHP 4).
D’ou surement l’erreur car ces fonctions DOM ne sont pas dispo. en PHP 4.
Selon les informations PHPNet: Description des directives internes du php.ini Cette directive est obsoléte et supprimé en PHP 5.3.0.

Commentaire par lemoussel

Mardi, 26 janvier , 2010 à 18:52

@Nicolas 2 ^^ : Oups ! Petit souci certaines balises sont interprétées !

Je disais donc :

Il faut bien lire ce Tuto. Entre autre les remarques !
En effet les « titres » de google vidéo, sont dans des balises <table> et comme je l’indique Firebug rajoute des balises <tbody> qu’il faut supprimer si elles sont non présente dans la structure DOM de la page HTML. Ce qui est le cas pour les « titres » de google vidéo.

Commentaire par Nicolas 2

Mardi, 26 janvier , 2010 à 23:39

Merci de ta réponse,

j’avais bien lu la remarque du tbody, il m’a tout simplement échappé :P

Sinon je disais donc si on veut faire du scraping des positions et extraire toute les places de chaque page.

Ma seule technique mais qui doit être foireuse par manque de connaissance en DOM est de faire un array php temporaire, et faire autant de foreach que j’ai de « capture » à faire pour incrémenter mon tableau récupérant position, titre,domain, video etc..

Je crois que je me complique la vie d’ou la question si il est possible sur un seul foreach de prendre plusieurs « query » ?

Encore merci, tu m’ouvres la porte à pleins de tests :P

Commentaire par Eric

Mercredi, 27 janvier , 2010 à 12:24

Encore un très bon script ! Merci

Commentaire par thoskan

Mercredi, 27 janvier , 2010 à 21:11

Tout simplement excellent, je cherchais comment récupérer des données depuis myspace pour construire un fichier XML….merci mille fois !

ça cartonne, tout simplement.
Votre blog me redonne du baume au coeur .

Commentaire par Olivier

Samedi, 27 février , 2010 à 7:33

Bonjour,

Merci pour ce script qui est fantastique. Je ne comprends pas cependant pourquoi je n arrive à extraire les urls de google avec ce script et en utilisant firebug. Quel est le problème ? J’ai l’impression que le code que me donne Firebug n’est pas bon puisqu’aucun résultat ne m’est renvoyé. Auriez vous la gentillesse de m’aider sur ce point ??? par avance, merci !

Commentaire par Clément

Vendredi, 2 avril , 2010 à 15:22

Xpath est un langage vraiment puissant qui m’a fait oublier les regexp compliquées pour extraire des éléments d’un document XML et HTML. Ceci dit plutot que de copier « betement » le chemin via Firebug vous pouvez aussi lire ce tuto qui permet de découvrir pas mal de fonctionnalités interessantes.
Tutoriel xPath
A bientot

Commentaire par Aero @ Sageo.info

Vendredi, 30 avril , 2010 à 2:46

Je n’avais même jamais vu cette fonctionnalité de firebug.

Ayant posté un sujet sur les scrapers sur mon blog, j’ai fait un lien vers votre article quand aux solutions possible pour implémenter un scraper.

Commentaire par Change the world

Lundi, 7 février , 2011 à 12:35

Merci de m’avoir fait découvrir le Xpath. Beaucoup plus efficace que les regex pour scraper du contenu. Il y a Yahoo queries Langage avec une interface simple qui permet d’executer ça via une http_get.

Les commentaires sont fermés pour cet article.



SEO BLACKOUT

Site web dédié aux techniques de référencement et de positionnement de sites web sur Google.

Certaines parties du site sont en accès restreint, ces espaces sont réservés à la SEO Black Hat Team.


Don't Be Evil !