2009-10-20 10 views
0

Salut J'ai la page d'accueil d'un site Web que je lis en utilisant Curl et j'ai besoin de saisir le nombre de pages que le site a.extraire la valeur de la page Web

L'information est dans un div: -

<div class="pager"> 
<span class="page-numbers current">1</span> 
<a href="/users?page=2" title="go to page 2"><span class="page-numbers">2</span></a> 
<a href="/users?page=3" title="go to page 3"><span class="page-numbers">3</span></a> 
<a href="/users?page=4" title="go to page 4"><span class="page-numbers">4</span></a> 
<a href="/users?page=5" title="go to page 5"><span class="page-numbers">5</span></a> 
<span class="page-numbers dots">&hellip;</span> 

<a href="/users?page=15" title="go to page 15"><span class="page-numbers">15</span></a> 
<a href="/users?page=2" title="go to page 2"><span class="page-numbers next"> next</span></a> 
</div> 

La valeur que j'ai besoin est 15, mais cela pourrait être un nombre en fonction du site, mais sera toujours dans la même position.

Comment pourrais-je lire facilement cette valeur et l'affecter à une variable en PHP.

Merci

Jonathan

Répondre

2

Vous pouvez utiliser PHP's DOM module pour cela. Lisez la page avec DOMDocument :: loadhtmlfile(), puis créez un objet DOMXPath et interrogez tous les éléments span du document ayant l'attribut class = "page-numbers".

(edit: oups, pas ce que vous cherchez, voir le deuxième extrait de code)

$html = '<html><head><title>:::</title></head><body> 
<div class="pager"> 
<span class="page-numbers current">1</span> 
<a href="/users?page=2" title="go to page 2"><span class="page-numbers">2</span></a> 
<a href="/users?page=3" title="go to page 3"><span class="page-numbers">3</span></a> 
<a href="/users?page=4" title="go to page 4"><span class="page-numbers">4</span></a> 
<a href="/users?page=5" title="go to page 5"><span class="page-numbers">5</span></a> 
<span class="page-numbers dots">&hellip;</span> 

<a href="/users?page=15" title="go to page 15"><span class="page-numbers">15</span></a> 
<a href="/users?page=2" title="go to page 2"><span class="page-numbers next"> next</span></a> 
</div> 
</body></html>'; 

$doc = new DOMDocument; 
// since the content "is already here" we use loadhtml(content) 
// instead of loadhtmlfile(url) 
$doc->loadhtml($html); 
$xpath = new DOMXPath($doc); 
$nodelist = $xpath->query('//span[@class="page-numbers"]'); 
echo 'there are ', $nodelist->length, ' span elements having class="page-numbers"'; 

modifier: Cette

<a href="/users?page=15" title="go to page 15"><span class="page-numbers">15</span></a> 

(le second dernier élément a) toujours le point à la dernière page, c.-à-d. ce lien contient-il la valeur que vous recherchez?
Ensuite, vous pouvez utiliser une expression XPath qui sélectionne l'élément a deuxième mais dernier et à partir de là son élément span enfant.

//div[@class="pager"] <- select each <div> where the attribute class equals "pager" 
//div[@class="pager"]/a <- select each <a> that is a direct child of the pager div 
//div[@class="pager"]/a[position()=last()-1] <- select the <a> that is second but last 
//div[@class="pager"]/a[position()=last()-1]/span <- select the direct child <span> of that second but last <a> element in the pager <div> 

(vous voudrez peut-être chercher un bon tutoriel XPath ;-))

$doc->loadhtml($html); 
$xpath = new DOMXPath($doc); 
$nodelist = $xpath->query('//div[@class="pager"]/a[position()=last()-1]/span'); 
if (0 < $nodelist->length) { 
    echo $nodelist->item(0)->nodeValue; 
} 
else { 
    echo 'not found'; 
} 
+0

génial - merci, je me réjouis de ce –

+0

Salut j'ai essayé cela, mais il est revenu getUsers fonction zéro (userurl de $) { $ doc = new DOMDocument; $ doc-> loadhtml ($ userurl); $ xpath = new DOMXPath ($ doc); $ nodelist = $ xpath-> query ('// span [@ class = "page-nombres"]'); print_r ($ nodelist); echo 'il y a', $ nodelist-> longueur, 'span éléments ayant class = "page-numbers"'; } L'URL est http://ask.recipelabs.com/users –

+1

Si vous transmettez l'URL, vous avez besoin de loadhtmlFILE(), pas de loadhtml(). – VolkerK

0

Il n'y a pas de fonction directe ou moyen facile de le faire. Vous devez construire ou utiliser un existing HTML parser pour le faire.

0

Vous pouvez l'analyser avec une expression régulière. Trouvez d'abord tous les occurense de <span class="page-numbers">, puis sélectionnez le dernier:

// div html code should be in $div_html 
preg_match_all('#<span class="page-numbers">(\d+)#', $div_html, $page_numbers); 
print_r(end($page_numbers[1])); // prints 15 
0

C'est quelque chose que vous voudrez peut-être utiliser un XPath pour - ce qui nécessite le chargement de la page comme un objet document dom:

$domDoc = new DOMDocument(); 
$domDoc->loadHTMLFile("http://path/to/yourfile.html"); 
$xp = new DOMXPath($domDoc); 
$nodes = $xp->query("//xpath/to/relevant/node"); 
$value = $nodes[0]; 

Je n'ai pas écrit un bon xpath depuis un moment, vous devriez donc faire quelques lectures pour comprendre cette partie, mais cela ne devrait pas être trop difficile.

0

peut-être

$nodes = $dom->getElementsByTagName("span"); 
$maxPageNum = 0; 
foreach($nodes as $node) 
{ 
    if($node.class == "page-numbers" && $node.value > $maxPageNum) 
    { 
     $maxPageNum = $node.value; 
    } 
} 

Je ne sais pas PHP, alors peut-être ce n'est pas facile d'accéder au texte de la classe/intérieure d'un noeud dom, mais il doit y avoir un moyen d'obtenir cette information et le pseudo-code ici devrait fonctionner.

0

Je voulais juste dire un grand merci à Volkerk pour aider - cela a très bien fonctionné.Je devais faire quelques petits changements et a fini par ceci: -

function getusers($userurl) 
{ 
$sSourceData = file_get_contents($userurl); 
$doc = new DOMDocument(); 
@$doc->loadHTML($sSourceData); 

$xpath = new DOMXPath($doc); 
$nodelist = $xpath->query('//div[@class="pager"]/a[position()=last()-1]/span'); 
if (0 < $nodelist->length) { 

    $lastpage = $nodelist->item(0)->nodeValue; 
    $users = $lastpage * 35; 
    $userurl = $userurl.'?page='.$lastpage; 

    $sSourceData = file_get_contents($userurl); 

$doc = new DOMDocument(); 
@$doc->loadHTML($sSourceData); 
$xpath = new DOMXPath($doc); 
$nodelist = $xpath->query('//div[@class="user-details"]'); 
$users = $users + $nodelist->length; 
echo 'there are ', $users , ' users'; 

} 
else { 
$xpath = new DOMXPath($doc); 
$nodelist = $xpath->query('//div[@class="user-details"]'); 
echo 'there are ', $nodelist->length, ' users'; 
} 


} 
Questions connexes