2010-07-06 7 views
3

J'essaye d'analyser un fichier html.php xpath: requête dans un résultat de requête

L'idée est d'extraire les classes title et desc et de récupérer leurs informations dans chaque div ayant l'attribut class = 'thebest'.

voici mon code:

<?php 

$example=<<<KFIR 
<html> 
<head> 
<title>test</title> 
</head> 
<body> 
<div class="a">moshe1 
<div class="aa">haim</div> 
</div> 
<div class="a">moshe2</div> 
<div class="b">moshe3</div> 

<div class="thebest"> 
<span class="title">title1</span> 
<span class="desc">desc1</span> 
</div> 
<div class="thebest"> 
span class="title">title2</span> 
<span class="desc">desc2</span> 
</div> 

</body> 
</html> 
KFIR; 


$doc = new DOMDocument(); 
@$doc->loadHTML($example); 
$xpath = new DOMXPath($doc); 
$expression="//div[@class='thebest']"; 
$arts = $xpath->query($expression); 

foreach ($arts as $art) { 
    $arts2=$xpath->query("//span[@class='title']",$art); 
    echo $arts2->item(0)->nodeValue; 
    $arts2=$xpath->query("//span[@class='desc']",$art); 
    echo $arts2->item(0)->nodeValue; 
} 
echo "done"; 

les résultats attendus sont les suivants:

title1desc1title2desc2done 

les résultats que je reçois sont:

title1desc1title1desc1done 

Répondre

10

Effectuez les requêtes relatives ... démarrez-les avec un point (par exemple ".//…").

foreach ($arts as $art) { 
    // Note: single slash (direct child) 
    $titles = $xpath->query("./span[@class='title']", $art); 
    if ($titles->length > 0) { 
     $title = $titles->item(0)->nodeValue; 
     echo $title; 
    } 

    $descs = $xpath->query("./span[@class='desc']", $art); 
    if ($descs->length > 0) { 
     $desc = $descs->item(0)->nodeValue; 
     echo $desc; 
    } 
} 
1

Au lieu de faire la deuxième requête essayer textContent

foreach ($arts as $art) { 
    echo $art->textContent; 
} 

textContent renvoie le contenu textuel de ce noeud et de ses descendants.

Comme alternative, changer le XPath pour

$expression="//div[@class='thebest']/span[@class='title' or @class='desc']"; 
$arts = $xpath->query($expression); 

foreach ($arts as $art) { 
    echo $art->nodeValue; 
} 

Ce serait chercher les enfants de portée des divs avec une classe thebest ayant une classe de titre ou desc.

Questions connexes