2009-10-13 7 views
4

Je suis en train d'analyser un document HTML avec XPATH et je veux garder toutes les balises html internes.PHP XPATH du document HTML omettant toutes les balises. Je veux les garder

Le code HTML en question est une liste non ordonnée comportant de nombreux éléments de liste.

<ul id="adPoint1"><li>Business</li><li>Contract</li></ul> 

Je suis l'analyse du document en utilisant le code PHP suivant

$dom = new DOMDocument(); 
@$dom->loadHTML($output); 
$this->xpath = new DOMXPath($dom); 
$testDom = $this->xpath->evaluate("//ul[@id='adPoint1']"); 
$test = $testDom->item(0)->nodeValue; 
echo htmlentities($test); 

Pour une raison quelconque la sortie a toujours les balises HTML omis de lui. Je suppose que c'est parce que XPATH n'était pas destiné à être utilisé de cette manière, mais est-ce qu'il y en a autour de ça? Je voudrais vraiment continuer à utiliser XPATH car je l'utilise déjà pour analyser d'autres zones de la page (simples éléments href) sans problème.

EDIT: Je sais qu'il existe un meilleur moyen d'obtenir les données en itérant à travers les éléments enfants de l'UL. Il y a une partie plus compliquée de la page que je veux aussi analyser (bloc de javascript), mais j'essaie de fournir un exemple plus facile à comprendre.

Le bloc réel de code que je veux est

<script language="javascript">document.write(rot_decode('<u7>Pbagnpg Qrgnvyf</u7><qy vq="pbagnpgQrgnvyf"><qg>Cu:</qg><qq>(58) 0078 8455</qq></qy>'));</script> 

Il a le problème qu'il omet toutes les balises de fermeture, mais maintient les balises d'ouverture. Je suppose que c'est parce que XPATH essaie d'analyser les éléments internes plutôt que de les traiter comme une chaîne.

Si je tente et sélectionnez l'élément de script avec

$testDom = $this->xpath->evaluate("//div[@id='businessDetails']/script"); 
$test = $testDom->item(0)->nodeValue; 
echo htmlentities($test); 

ma sortie sera, que vous pouvez voir est manquant toutes les balises de fermeture.

document.write(rot_decode('<u7>Pbagnpg Qrgnvyf<qy vq="pbagnpgQrgnvyf"><qg>Cu:<qq>(58) 0078 8455')); 

Répondre

2

J'ai décidé que XPATH n'était pas adapté à ce que je voulais et j'utilise maintenant PHP Simple HTML DOM Parser qui est bien mieux adapté à la tâche.

Il maintient très bien le formatage interne html.

foreach($this->simpleDom->find('script[language=javascript]') as $script) { 
     echo htmlentities($script->innertext()); 
} 
1

Oui, vous avez raison, DOM parse les éléments enfants (parce qu'ils sont des éléments et non cordes), et la bonne façon d'obtenir des données à partir d'éléments de l'enfant est à itérer tous. La mise en œuvre de ce ne serait pas compliqué, cependant.
Vous voudrez peut-être essayer une autre expression XPath ainsi, au lieu de

//ul[@id='adPoint1'] 

essayer

//ul[@id='adPoint1']/li 

qui sélectionner des éléments avec des valeurs de chaîne réelle.
Si vous donnez le résultat attendu (pour le script ul et le script), vous obtiendrez peut-être plus de réponses.

+0

phunehehe, oui vous avez raison, mais je suis à la recherche d'une solution qui maintiendra les balises dans un élément. J'essaie vraiment d'obtenir une chaîne qui contient le code javascript dans son intégralité. – uberweb

Questions connexes