2010-10-10 6 views
3

J'essaie d'utiliser DOMDocument et XPath pour rechercher un document HTML en utilisant PHP. Je veux rechercher par un nombre tel que «022222», et il devrait retourner la valeur de la balise h2 correspondante. Des idées sur la façon dont cela serait fait?Recherche d'un document HTML en PHP

Le document HTML peut être trouvé à http://pastie.org/1211369

+0

Donc, dans ce cas, vous voulez obtenir 'Point 2', non? – Gumbo

+0

Exactement, désolé aurait dû donner un exemple dans la question – RichW

+0

Bonne question, +1. Voir ma réponse pour une expression XPath plus lisible et maintenable qui sélectionne le nœud désiré. –

Répondre

2

Comment cela?

$sxml = simplexml_load_string($data); 
$find = "022222"; 

print_r($sxml->xpath("//li[.='".$find."']/../../../div[@class='content']/h2")); 

Il retourne:

Array 
(
    [0] => SimpleXMLElement Object 
     (
      [0] => Item 2 
     ) 

) 

//li[.='xxx'] localiseront le li votre recherche pour. Ensuite, nous utilisons ../ pour augmenter trois niveaux, avant de descendre dans le contenu-div, comme spécifié par div[@class='content']. Finalement, nous choisissons l'enfant h2.

Juste Pour votre information, voici comment le faire en utilisant DOM:

$dom = new DOMDocument(); 
$dom->loadXML($data); 

$find = "022222"; 

$xpath = new DOMXpath($dom); 
$res = $xpath->evaluate("//li[.='".$find."']/../../../div[@class='content']/h2"); 

if ($res->length > 0) { 
    $node = $res->item(0); 
    echo $node->firstChild->wholeText."\n"; 
} 
+2

Brillant, fonctionne parfaitement. Je n'avais aucune idée que vous pourriez traverser le DOM en utilisant ../ Merci! – RichW

+0

@RichW, de rien. :) –

2
I want to search by a number such as '022222', and it should return the value of the corresponding h2 tag. Any thoughts on how this would be done? 

The HTML document can be found at http://pastie.org/1211369 

Pour commencer, le texte à l'provided link n'est pas un XML bien formé ou d'un document XHtml et ne peut pas être directement analysé avec XPath.

Par conséquent je l'ai enveloppé dans un élément <html>.

Sur ce document XML une des expressions XPath qui sélectionne exactement le noeud texte recherché est:

/*/div[div/ul/li = '022222']/div[@class='content']/h2/text() 

Entre autres avantages, cette expression XPath n'utilise aucun axe inverse et est donc plus lisible .

Le document XML complet sur lequel cette expression XPath est évaluée est la suivante:

<html> 
<div class="item"> 
    <div class="content"><h2>Item 1</h2></div> 
    <div class="phone"> 
     <ul class="phone-single"> 
      <li></li> 
     </ul> 
    </div> 
</div> 

<div class="item"> 
    <div class="content"><h2>Item 2</h2></div> 
    <div class="phone"> 
     <ul class="phone-multiple"> 
     <li>022222</li> 
      <li>033333</li> 
     </ul> 
    </div> 
</div> 

<div class="item"> 
    <div class="content"><h2>Item 3</h2></div> 
    <div class="phone"> 
     <ul class="phone-single"> 
      <li>02345 678901</li> 
     </ul> 
    </div> 
</div> 

<div class="item"> 
    <div class="content"><h2>Item 4</h2></div> 
    <div class="phone"> 
     <ul class="phone-multiple"> 
      <li>099999999</li> 
      <li>088888888</li> 
     </ul> 
    </div> 
</div> 
</html> 
+0

Un autre grand exemple Dimitre, merci pour cela. Je vois ce que vous voulez dire à propos d'être plus lisible. La raison pour laquelle le XML n'a pas été bien formé est qu'il s'agit simplement d'un extrait d'un document, le XML réel est un document très en désordre qui semble inutile à poster ici. – RichW

+1

+1, c'est une expression xpath beaucoup plus propre que la mienne. Ca fait un moment que je travaillais régulièrement avec xpath, donc j'ai l'impression d'avoir un peu oublié. :) –