2010-09-02 6 views
2

Pourquoi ce qui suit fonctionne pas ?:xPath: Pourquoi ce qui suit ne fonctionne pas?

$dom = new DOMDocument(); 
@$dom->load('http://tinyurl.com/35cs96n'); 
$xpath = new DOMXPath($dom); 

$entries = $xpath->query('//table[@id="SubCategory_SubCategoryDataList"]/a/@href'); 

foreach ($entries as $entry) { 
    echo $entry->nodeValue.'<br>'; 
} 
+1

Are 'fopen()' wrappers activés? De plus, je vous recommande de ne pas utiliser le raccourci de l'URL, car il s'agit d'un hiccup inutile pour accéder à la page qui peut être ou ne pas être toujours disponible. – alex

+1

Pouvez-vous expliquer ce que «ne fonctionne pas» signifie exactement? Qu'est-ce qui est supposé arriver qui ne l'est pas? – Oded

Répondre

3

est-il pas censé être //table[@id="SubCategory_SubCategoryDataList"]//a/@href

(Notez les deux barres obliques avant la a, puisque vous ne regardez pas les enfants directs)

3

Si votre code contient un opérateur de suppression d'erreur (@), la première chose à faire est de le supprimer pour voir s'il a effectivement supprimé les erreurs. Dans votre cas, il l'a fait. Beaucoup. Tellement en fait que DOM ne pouvait pas charger le contenu (au moins il ne montrerait pas quand j'ai essayé de sortir le fichier avec saveXML()). La bonne façon de charger HTML cassé avec DOM est d'utiliser:

libxml_use_internal_errors(TRUE); 
$dom = new DOMDocument(); 
$dom->loadHTMLFile('http://tinyurl.com/35cs96n'); 
libxml_clear_errors(); 

chargement de la page avec loadHTMLFile fera DOM utiliser le module HTMLParser qui est beaucoup plus indulgent au sujet de balisage cassé. Et les appels de la fonction libxml vous éviteront les erreurs. Pour la XPath, essayez @slhck's suggestion. Les éléments a ne sont pas des enfants directs de la table. Il y a des éléments tr et td entre eux. Si vous regardez le code HTML, vous verrez que les éléments a auront tous ids dérivés de l'ID de table eux-mêmes, de sorte que vous pouvez les interroger directement avec

'//a[contains(@id, "SubCategory_SubCategoryDataList")]/@href' 
+0

Belle addition, merci! – slhck