2010-09-02 3 views
2

Почему следующее не работает ?:xPath: Почему следующее не работает?

$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

ли 'FOPEN()' включены фантики? Кроме того, я бы рекомендовал отказаться от укороченной ссылки URL, так как это одна лишняя икота, чтобы попасть на страницу, которая может или не всегда доступна. – alex

+1

Не могли бы вы объяснить, что означает «не работает»? Что должно случиться, а это не так? – Oded

ответ

3

Разве это не должно быть //table[@id="SubCategory_SubCategoryDataList"]//a/@href

(Обратите внимание на две косых черт и перед a, так как вы не смотрите на прямых детей)

3

Если ваш код содержит оператор подавления ошибок (@), первое, что нужно сделать, это удалить его, чтобы увидеть, действительно ли он вызвал ошибки. В вашем случае это было так. Много. Так много на самом деле, что DOM не смог загрузить контент (по крайней мере, он не показывал бы, когда я пытался вывести файл с saveXML()). Правильный способ загрузки сломанной HTML с DOM является использование:

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

Загрузка страницы с loadHTMLFile сделает DOM использовать модуль HTMLparser который является гораздо более снисходительными о сломанной разметке. И вызовы функций libxml будут держать ошибки от вас.

Что касается XPath, попробуйте @slhck's suggestion. Элементы a не являются прямыми дочерними элементами таблицы. Между ними есть tr и td элементы. Если вы посмотрите на HTML, вы увидите, что элементы а все будут иметь идентификаторы, полученные от самого идентификатора таблицы, так что вы можете запросить их непосредственно

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

Хорошее дополнение, спасибо! – slhck

Смежные вопросы