2010-11-23 3 views
1

J'essaie de récupérer tous les termes en gras d'une page de résultats google et de les placer dans un tableau associatif, mais les résultats sont eratiques. Il semble seulement extraire des termes de mots simples et parfois (en fonction de la requête) il saisit des mots qui ne sont pas en gras. Est-ce que quelqu'un sait ce que je fais mal? Merci d'avance.php - Comment puis-je extraire des termes en gras d'une page Web et les mettre dans un tableau associatif?

$gurl = "http://www.google.com/search?q=marketingpro"; 
$data = file_get_contents($gurl); 

// get bolded 
preg_match_all('/<b>(\w+)<\/b>/', $data, $res, PREG_PATTERN_ORDER); 
$H = $res[0]; 
foreach($H as $X){ 
$bold = strtolower($X); 
$array[$bold] += 1; 
} 
print_r($array); 

Répondre

0

/<b>(\w+)<\/b>/ correspondra uniquement s'il y a un mot à l'intérieur, l'espace et des caractères autres que 0-9a-z et _ on omettra dans votre résultat. Je suggère à la recherche de /<b>([^<]+)<\/b>/, ou dom/xml parseurs (mais puisque Google a html invalide, ceux-ci peuvent échouer)

+0

essayé cela, mais ne fonctionne pas (il ne me donne rien). Merci quand même – Steven

+0

Fonctionne pour moi, mais résultats avec 10 occurrences de '...', qui devraient être filtrés en boucle. Et celui-ci ne comprendra pas ' marketing pro', alors il vaut mieux aller avec dom parser. –

1

Essayez:

$doc = new DOMDocument(); 
@$doc->loadHTMLFile('http://www.google.com/search?q=marketingpro'); 
$xpath = new DOMXpath($doc); 
$terms = array(); 
foreach ($xpath->query('//b') as $b) 
{ 
    $terms[$b->nodeValue] = true; 
} 

var_dump(array_keys($terms)); 

Pour moi, je reçois:

array(15) { 
    [0]=> 
    string(3) "Web" 
    [1]=> 
    string(13) "marketing pro" 
    [2]=> 
    string(12) "marketingpro" 
    [3]=> 
    string(3) "..." 
    ... snip ... 
    [14]=> 
    string(9) "marketing" 
} 
0

Vous pouvez penser à utiliser un parseur DOM. Il y a une ici:

http://simplehtmldom.sourceforge.net/

Ou, faire quelque chose comme ceci:

function getTextBetweenTags($string, $tagname) 
{ 
    $pattern = "/<$tagname>(.*?)<\/$tagname>/"; 
    preg_match($pattern, $string, $matches); 
    return $matches[1]; 
} 

qui fonctionnera aussi longtemps que nommarqueur $ ne possède pas d'attributs, les balises « » ne devrait pas.

0

Il extrait seulement des mots simples, parce que c'est ce que signifie \w+. Vous pouvez utiliser un motif correspondant plus large comme ([^<>]+) à la place.

Ou mieux encore, utilisez QueryPath or phpQuery, qui sont plus faciles sur les yeux:

foreach (qp($html)->find("b") as $bold) { 
    $bold = strtolower($bold->text()); 
    $array[$bold] += 1; 
} 
Questions connexes