xPath: Почему следующее не работает? - PullRequest
2 голосов
/ 02 сентября 2010

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

$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>';
}

Ответы [ 2 ]

3 голосов
/ 02 сентября 2010

Если ваш код содержит оператор подавления ошибок (@), первое, что нужно сделать, это удалить его, чтобы увидеть, действительно ли он подавляет ошибки. В твоем случае так и было. Много. Так много на самом деле, что 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 . Элементы a не являются прямыми дочерними элементами таблицы. Между ними есть элементы tr и td. Если вы посмотрите на HTML, вы увидите, что все элементы a будут иметь идентификаторы, полученные из идентификатора таблицы, поэтому вы можете запросить их напрямую с помощью

 '//a[contains(@id, "SubCategory_SubCategoryDataList")]/@href'
3 голосов
/ 02 сентября 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...