parser, xpath

Mammouth du PHP | 504 Messages

14 déc. 2011, 15:14

Bonjour,

Je suis entrain de faire un parser pour recuperer les titres des resultats google.

J'ai écrit ça, mais ça ne fonctionne pas.
<?php
 header('Content-type: text/html; charset=UTF-8');

$googlefrurl = "http://www.google.fr/search?hl=fr&q=audi";



$dom = new DOMDocument();

@$dom->loadHTML($googlefrurl);

$xpath = new Domxpath($dom);

$str_nodes1="/html/body/div[4]/div/div/div[4]/div[2]/div[2]/div/div[2]/div/ol/li/div/h3/a";
$result1 = $xpath->query($str_nodes1);
$titre ='';
foreach ($result1 as $div1) {
echo $titre.= $div1->nodeValue .'<br>';
}
echo  '<br /><br />'."\n";

echo $googlefrurl;

 ?>
Quelqu'un a une idée ??

ViPHP
ViPHP | 2577 Messages

14 déc. 2011, 15:28

Bonjour,

A part le fait que ca ne marche pas, qu'est ce qui se passe exactement. Quel est le problème que tu rencontres ?

Une des premières choses à faire, est déjà d'enlever le @ devant dom->loadHTML($googlefrurl); car ca cache un éventuel message d'erreur.
Une autre chose serait d'afficher echo $div1->nodeName,' => ',$div1->nodeValue,'<br>'; dans la boucle.

Mammouth du PHP | 504 Messages

14 déc. 2011, 15:36

J'ai ce message d'erreur:

Warning: DOMDocument::loadHTML() [function.DOMDocument-loadHTML]: htmlParseEntityRef: expecting ';' in Entity, line: 1 in C:\Program Files\EasyPHP 2.0b1\www\extract-google-essai.php on line 10

ViPHP
ViPHP | 2577 Messages

14 déc. 2011, 16:03

Le message me fait penser que la page que tu veux parser n'est pas écrite dans un html correct.

Pour info : 85 Errors, 7 warning(s)
source : http://validator.w3.org/check?uri=http% ... ne&group=0

Mammouth du PHP | 504 Messages

14 déc. 2011, 16:07

Donc, on ne peut parser cette page? pourtant c'est une page de résultats google ??

ViPHP
ViPHP | 2577 Messages

14 déc. 2011, 16:28

Il semble d'après le message que la page comporte une erreur bloquante pour l'analyse de la page. La page est reconnu par le valideur du w3c comme une page html5, peut être que ca ne facilite pas la tache du parser.

Mammouth du PHP | 504 Messages

14 déc. 2011, 17:07

Re,

Ce code ci marche pour extraire les url des pages de resultats:
<?php
//Script php : Extraction urls Résultats Google
// Copyrights 2008 Seoblackout.com
//http://www.seoblackout.com
//Url script : http://www.seoblackout.com/2008/10/26/extraire-resultats-google/

@set_time_limit(0);
$useragent='Mozilla/5.0';
$regex='<h3 class="r">';
$regex_titre='<h3 class="r">';
$regex_snipets='<h3 class="r">';

//extension et langue google
if ((isset($_POST['ext'])) && ($_POST['ext']!=''))
{
	$ext=strip_tags($_POST['ext']);
	if ($ext=='fr') {
	$lang='fr';
	}
	else if ($ext=='com') {
	$lang='en';
	}
	else if ($ext=='es') {
	$lang='es';
	}
	else if ($ext=='de') {
	$lang='de';
	}
	else if ($ext=='ca') {
	$lang='en';
	}
	else if ($ext=='ca2') {
	$ext='ca';
	$lang='fr';
	}
	else {
	$ext='fr';
	$lang='fr';
	}
}
else
{
	// par défaut, on recherche sur google.fr et lang=fr
	$ext='fr';
	$lang='fr';
}
//nombre de page à extraire :
if ((is_numeric($_POST['pages'])) && ($_POST['pages']!=''))
{
	$c=(strip_tags($_POST['pages'])-1);
}
else
{
	//10 pages par défaut, on part de 0 donc 10 pages = 9
	$c=9;
}

if ((isset($_POST['kw'])) && ($_POST['kw']!=''))
{
	$kw=trim(strip_tags($_POST['kw']));
	$pagenum = 0;
	$googlefrurl = "http://www.google.".$ext."/search?hl=".$lang."&q=" . urlencode($kw) . "&start=$pagenum";
	$url_new = '';

	while($pagenum <= $c)
	{
			if (function_exists('curl_init'))
			{
				$ch = curl_init();
				curl_setopt($ch, CURLOPT_USERAGENT, $GLOBALS['useragent']);
				curl_setopt($ch, CURLOPT_URL,$googlefrurl);
				curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
				$result=curl_exec ($ch);
				curl_close ($ch);
			}
			else
			{
				$result= file_get_contents($googlefrurl);
			}
		preg_match_all('/'.$regex.'<a href="(.*?)"/si', $result, $matches);


			$i = 0;
			$n = count($matches[1]);
			$pagenum++;
			$pagenum2 = $pagenum.'0';
			$googlefrurl = "http://www.google.".$ext."/search?hl=".$lang."&q=" . urlencode($kw) . "&start=$pagenum2&safe=off&pwst=1&filter=0";

			while($i <= $n)
			{
				$url_new1 = addslashes($matches[1][$i]);
				$url_new .= trim($matches[1][$i])."<br>";
				$i++;
flush();





			}
	}
	$url_new .= '';





}
?>
<!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>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Extraction Urls résultats Google</title>
</head>
<body>
<h1>Extraction Urls résultats Google</h1>
<div>
<?php
if ((isset($_POST['kw'])) && ($_POST['kw']!='')) {
	echo "<h3>Keyword : ",strip_tags($kw),"</h3>";
	echo "<h6>Google Results</h6>";
	echo str_replace('<br><br>','<br>',$url_new);
	echo str_replace('<br><br>','<br>',$titre_new);
	echo str_replace('<br><br>','<br>',$snipets_new);
}
?>
<form method="POST" action="<?php echo strip_tags($_SERVER['REQUEST_URI']) ;?>">
<p>Saisir vos mots-clés :</p>
<input name="kw" type="text" size="100" value="<?php if (isset($_POST['kw'])) {echo strip_tags($kw);} ?>">
<p>Nombre de pages à extraire (optionel => 10 pages par défaut):</p>
<input name="pages" type="text" size="3" maxlength="3" value="<?php if (isset($_POST['pages'])) {echo strip_tags($_POST['pages']);} else {echo '10';} ?>">
<p>Moteur :</p>
<select name="ext">
<option value="fr"<?php if (($_POST['ext'])=='fr') {echo ' selected';} ?>>Google.fr (hl=fr)</option>
<option value="com"<?php if (($_POST['ext'])=='com') {echo ' selected';} ?>>Google.com (hl=en)</option>
<option value="es"<?php if (($_POST['ext'])=='es') {echo ' selected';} ?>>Google.es (hl=es)</option>
<option value="de"<?php if (($_POST['ext'])=='de') {echo ' selected';} ?>>Google.de (hl=de)</option>
<option value="ca"<?php if (($_POST['ext'])=='ca') {echo ' selected';} ?>>Google.ca (hl=en)</option>
<option value="ca2"<?php if (($_POST['ext'])=='ca2') {echo ' selected';} ?>>Google.ca (hl=fr)</option>
</select>
<p><input type="submit" value="Go" name="go">
<input type='button' value='Annuler' onclick='location.href="<?php echo strip_tags($_SERVER['REQUEST_URI']) ;?>"'></p>
</form>
<br />
<small>Script proposé par SEO BlackOut : <a href="http://www.seoblackout.com/">référencement</a></small>
</div>
</body>
</html>
Maintenant, il me manque a extraire le titre et le snipets. J'ai bien reperer les blaise adéquates:
Titre: <h3 class=r>
snipet: <span Class=st>

mais j'y connais rien au fonctionnement du preg_match_all et comment lier tout ça; Merci de votre aide

Mammouth du PHP | 504 Messages

14 déc. 2011, 18:05

J'ai reussi à extraire le titre mais je rencontre un probleme sur les snippets avec cette balise:

<span class=st> apparement, cette fonction
preg_match_all('/<span class=st>(.*)<\/span>/U', $result, $matches);
ne semble aps fonctionner ??

ViPHP
xTG
ViPHP | 7331 Messages

14 déc. 2011, 19:44

Il te manque des quotes autour de la valeur de l'attribut class de la balise span.

Mammouth du PHP | 504 Messages

15 déc. 2011, 11:00

Meme avec les quotes. ça ne fontionne pas
preg_match_all('/<span class="st">(.*)<\/span>/U', $result, $matches);