2010-05-14 7 views
0

J'essaie d'extraire le prix de la page html ci-dessous en utilisant php cURL et preg_match. Au fond, je me attends pour ce code à la sortie 4550 mais pour certaines raisons que j'obtenirphp cURL. preg_match, extrait du texte de xhtml

 Notice: Undefined offset: 1 in C:\wamp\www\test.php on line 22

Je pense que le modèle est correct parce que si je mets le code HTML lui-même dans une variable et échapper à la « » ça marche! . Aussi si je produis (echo $ result;) il affiche le html correctement saisi depuis le site web de foxtons donc je ne peux pas comprendre pourquoi tout ça ne marche pas. J'ai besoin de faire ce travail et j'apprécierais aussi que vous me disiez pourquoi cet avis est généré et pourquoi mon script actuel ne fonctionne pas.

 
$url = " http://www.foxtons.co.uk/search?bedrooms_from=0&property_id=727717 "; 
$ch = curl_init($url);

curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1); $result = curl_exec($ch); curl_exec($ch); curl_close($ch); $result2 = str_replace('"', '\"', $result);

$tagname1= ");</script> "; $tagname2= "</noscript> per month</a>";

$pattern = "/$tagname1(.*?)$tagname2/"; preg_match($pattern, $result, $matches); $prices = $matches[1]; print_r($prices); ?>

+0

Pourquoi définissez-vous $ result2 si vous ne l'utilisez pas? – Artefacto

Répondre

0

Je réécrit le script un peu pour compte plus de 1 <noscript> sur la page. Vous aviez besoin d'utiliser preg_match_all qui cherchera tous les matchs et ne s'arrêtera pas au premier.



$url = "http://www.foxtons.co.uk/search?bedrooms_from=0&property_id=727717"; 
$ch = curl_init($url); 
curl_setopt($ch, CURLOPT_HEADER, 0); 
curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1); 
$result = curl_exec($ch); 
curl_exec($ch); 
curl_close($ch); 

preg_match_all("/<noscript>(.*)<\/noscript>/", $result, $matches); 
print_r($matches); 

Sorties



Array 
(
    [0] => Array 
     (
      [0] => £1,050 
      [1] => 4,550 
     ) 

    [1] => Array 
     (
      [0] => £1,050 
      [1] => 4,550 
     ) 

) 

J'ai essayé sur ma boîte et cela a fonctionné - laissez-moi savoir si cela a fonctionné pour vous

+0

oui ça marche aussi sur le mien. Je vais définir votre réponse comme acceptée mais j'apprécierais que vous m'expliquiez pourquoi mon script ne fonctionne pas pour que je puisse comprendre ce qui ne va pas. salutations, Michael! – Michael

+0

quelques choses que je vois - 1) vous ne devriez pas avoir besoin d'échapper les citations 2) Utilisez preg_match_all vs preg_match, preg_match_all trouve toutes les correspondances vs le premier match (qui dans ce cas n'est pas le résultat que vous cherchiez) 3) vous avez utilisé * et? dans la chaîne de motif,? correspond à zéro ou à une fois, * correspond à zéro ou plus –

0

Ne pas utiliser REGEX pour analyser html, utilisez un analyseur dom html au lieu, comme PHP Simple HTML DOM Parser

include("simple_html_dom.php") ; 

$html = file_get_html("http://www.foxtons.co.uk/search?bedrooms_from=0&property_id=727717"); 

foreach($html->find('noscript') as $noscript) 
{ 

    echo $noscript->innertext."<br>"; 
} 

écho:

£1,600 
6,934 
£1,500 
6,500 
£1,350 
5,850 
£950 
4,117 
£925 
4,009 
£850 
3,684 
£795 
3,445 
£795 
3,445 
£775 
3,359 
£750 
3,250