DOMCrawler неправильно выгружает данные для синтаксического анализа

Я использую Symfony, Goutte и DOMCrawler для очистки страницы. К сожалению, на этой странице много устаревших таблиц данных и нет ни идентификаторов, ни классов, ни идентифицирующих факторов. Итак, я пытаюсь найти таблицу, анализируя исходный код, который я получаю из запроса, но я не могу получить доступ к какой-либо информации.

Я думаю, что когда я пытаюсь его отфильтровать, он фильтрует только первый узел, а мои нужные данные не там, поэтому он ничего не возвращает.

поэтому у меня есть объект $crawler. И я попытался пройти через следующее, чтобы получить то, что я хочу:

$title = $crawler->filterXPath('//td[. = "Title"]/following-sibling::td[1]')->each(funtion (Crawler $node, $i) {
        return $node->text();
});

Я не уверен, что Crawler $node, я только что получил это из примера на веб-странице. Возможно, если я смогу заставить это работать, тогда он будет перебирать каждый узел в объекте $crawler и найдет то, что я на самом деле ищу.

Вот пример страницы:

<table> 
<tr>
    <td>Title</td>
    <td>The Harsh Face of Mother Nature</td>
   <td>The Harsh Face of Mother Nature</td>
</tr>
.
.
.
</table>

И это только один стол, там много столов и огромный неаккуратный бардак за пределами этого. Любые идеи?

(Примечание: раньше я мог применить фильтр к объекту $crawler для получения некоторой информации, которая мне была нужна, затем я serialize() получил информацию и, наконец, получил строку, что имело смысл. Но я больше не могу получить строку, не знаю почему. )


person Kenny    schedule 25.03.2015    source источник


Ответы (2)


Функция DomCrawler html() не выводит весь html в соответствии с описанием функции:

http://api.symfony.com/2.6/Symfony/Component/DomCrawler/Crawler.html#method_html

он возвращает только первый узел, который он сделал в вашем случае.

Вы можете использовать http://php.net/manual/en/domdocument.savehtml.php, так как DomCrawler представляет собой набор SplObjectStorage.

$html = $crawler->getNode(0)->ownerDocument->saveHTML();
person Nawfal Serrar    schedule 26.03.2015

Если вы просматриваете исходный код Crawler::html() вы увидите, что он выполняет следующее:

$html = '';
foreach ($this->getNode(0)->childNodes as $child) {
    $html .= $child->ownerDocument->saveHTML($child);
}
return $html;
person Shaun Bramley    schedule 02.04.2015