Если ваш код содержит оператор подавления ошибок (@
), первое, что нужно сделать, это удалить его, чтобы увидеть, действительно ли он подавляет ошибки. В твоем случае так и было. Много. Так много на самом деле, что 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'