0

这对我来说是一种学习体验,但使用的是 Symfony 和 Goutte。我已经能够登录到一个安全的网站,然后返回一个页面。

echo $crawler->html(); 

我现在要做的是解析对象$crawler。让我感到困惑的是,Goutte 似乎并没有说明如何做到这一点。我想很多人都用过 Guzzle 和 Goutte,但我不能use Guzzle\Client;use Goutte\Client;.

我要做的就是解析$crawler对象以在 html 源代码中找到某些内容。(注意:这个特定页面不使用 id 或 classes,所以我不能做filter('#stuff')or filter('.stuff')。)

有人可以帮我解释一下如何使用 Goutte 解析我得到的对象吗?

(编辑:我想指定,我想也许只是搜索一个字符串或其他东西。我可以将$crawler对象转换为纯文本源代码然后只做一个preg_match或什么吗?)

4

1 回答 1

2

$crawler 是Symfony DomCrawler 组件的一个实例;这实际上是一组DOMElement对象。

爬虫提供了相当多的功能,通过使用 XPath 查询过滤单个节点

$crawler = $crawler->filterXPath('descendant-or-self::body/p');

或使用 CSS 选择器。

$crawler = $crawler->filter('body > p');

通过使用任何一种方法,都可以使用 HTML 实体而不是属性来过滤您的文档。有关 CSS 选择器的更多信息可以在这里找到(这是来自 Google 搜索的第一个链接)。

输出爬虫对象的内部 HTML 的功能是在 2.3 中添加的,可以通过以下方式完成:

在 Symfony 2.3 中添加了 DomCrawler::html() 方法,它将“将列表的第一个节点返回为 HTML”。

$html = $crawler->html();

需要注意的是,当您执行过滤器时,会返回一个新的爬虫对象,其中包含DOMElements列表,这可能会导致一些意想不到的结果(至少这是我所经历的)。

编辑:针对您的评论,完全可以根据新标准进行过滤(参考下面的评论)。

您使用 CSS 选择器,例如:

[属性=值]

所以你的代码看起来像:

$crawler = $crawler->filter('a[href=' . $value . ']');

访问节点值可以像使用DOMCrawler 提供的函数或访问底层 DOMNode / NodeList / DOMElement 元素一样简单。

在幕后,DomCrawler 组件使用了CSS 选择器组件

于 2015-03-18T22:22:57.577 回答