2010-09-28 8 views
1

J'ai besoin pour analyser l'échantillon HTML suivant à l'aide requête XPath ..requête XPath pour analyser les balises HTML

<td id="msgcontents"> 
<div class="user-data">Just seeing if I can post a link... please ignore post 
    <a href="http://finance.yahoo.com">http://finance.yahoo.com</a> 
</div> 
</td> 

<td id="msgcontents"> 
<div class="user-data">some text2... 
    <a href="http://abc.com">http://abc.com</a> 
</div> 
</td> 

<td id="msgcontents"> 
<div class="user-data">some text3...  
</div> 
</td> 

Le code HTML ci-dessus peut répéter n fois pas dans une page.

Aussi parfois la partie ..... peut être absente comme indiqué dans les blocs html ci-dessus.

Ce que je besoin est la syntaxe XPath pour que je puisse obtenir les chaînes analysables comme

array1[0]= "Just seeing if I can post a link... please ignore post ttp://finance.yahoo.com" 
array[1]="some text2 htp://abc.com" 
array[2]="sometext3" 
+2

(1) Vous pouvez utiliser le bouton "code" pour mettre en retrait votre code HTML afin de le rendre avec des chevrons sans le déformer. (2) Votre question est ambiguë car l'attribut href a la même valeur que le texte d'ancrage, et vous ne clarifiez pas celui que vous recherchez. (3) HTML n'est pas forcément un langage XML valide, alors comprenez que l'utilisation de XPATH (qui nécessite du XML) n'est peut-être pas la route inactive, à moins que vous ne puissiez coaxer tout votre HTML en XML valide. –

+0

Le XPath pour sélectionner de tels éléments 'div' est'/html/body/table/tr/td/div [@ class = 'user-data'] '. Ensuite, vous avez besoin de la valeur de chaîne pour chaque noeud. Cela dépend de la méthode DOM du langage hôte. –

Répondre

0

Peut-être quelque chose comme ce qui suit:

$remote = file_get_contents('http://www.sitename.com'); 
    $dom = new DOMDocument(); 
    //Error suppression unfortunately, as an invalid xhtml document throws up warnings. 
    $file = @$dom->loadHTML($remote); 

    $xpath = new DOMXpath($dom); 

    //Get all data with the user-data class. 
    $userdata = $xpath->query('//*[contains(@class, \'user-data\')]'); 

    //get links 
    $links = $xpath->query('//a/@href'); 

Donc, pour accéder à une de ces variables, vous avez besoin utiliser nodeValue:

$ret = array(); 
foreach($userdata as $data) { 
    $ret[] = $data->nodeValue; 
} 

Edi t: Je pensais que je mentionnerais que cela va obtenir tous les liens sur une page donnée, je suppose que c'est ce que vous vouliez?

0

Utilisation:

concat(/td/div/text[1], ' ', /td/div/a) 

Vous pouvez utiliser au lieu de « » ci-dessus, quel que soit délimiteur que vous souhaitez à apparaître entre les deux chaînes.

+0

Merci beaucoup .. J'ai essayé votre solution mais je n'ai pas obtenu mon résultat. J'ai édité la question. Veuillez le réviser. – djk

Questions connexes