DOMCrawler没有正确地转储数据以进行解析

时间:2015-03-25 22:08:39

标签: php symfony web-scraping goutte domcrawler

我使用Symfony,Goutte和DOMCrawler来抓取页面。不幸的是,这个页面有许多旧式的数据表,没有ID或类或识别因素。所以我试图通过解析我从请求中获得的源代码来找到一个表,但我似乎无法访问任何信息

我认为当我尝试过滤它时,它只过滤第一个节点,而不是我想要的数据,所以它什么都不返回。

所以我有一个$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()信息,最后有一个字符串,这是有意义的。但是我再也找不到字符串了,为什么这么说。)

2 个答案:

答案 0 :(得分:1)

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();

答案 1 :(得分:0)

如果您查看Crawler::html()的来源,您会看到它正在执行以下操作:

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