【问题标题】:Goutte Scraper Parse through Page ObjectGoutte Scraper 通过页面对象解析
【发布时间】:2015-05-21 19:29:12
【问题描述】:

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

echo $crawler->html(); 

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

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

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

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

【问题讨论】:

    标签: symfony web-scraping web-crawler guzzle goutte


    【解决方案1】:

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

    爬虫通过使用 XPath 查询为filtering individual nodes 提供了相当多的功能

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

    或使用 CSS 选择器。

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

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

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

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

    $html = $crawler->html();
    

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

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

    您使用 CSS 选择器,例如:

    [属性=值]

    所以你的代码看起来像:

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

    访问节点值可以像使用 DOMCrawler Supplied Functions 或访问底层 DOMNode / NodeList / DOMElement 元素一样简单。

    DomCrawler Component 在幕后使用CSS Selector Component

    【讨论】:

    • 您好,感谢您的回答!假设有一个<a href="www.stuff.com/junkServlet?id=12345">,我需要搜索的是字符串“www.stuff.com/junkServlet?id=”。这完全改变了画面,你不能使用文件管理器或任何东西。如果我需要一个特定的<p> 标签怎么办?一旦我找到所有这些,我怎么能找到我需要的href=" "
    • 修改了上面的回复以回复您的新问题。
    • 感谢您的帮助!最后,是否允许使用通配符?例如,假设链接有一堆垃圾:<a onclick="window.open('http://thing.place.com/r.htm?e=842697&s=1&k=A2CF3582ECD50B5F218FE39F36C9A80C','thingURL','toolbar=yes,location=yes,directories=yes,status=yes,menubar=yes,scrollbars=yes,height=600,width=800');return false;" href="#">Some URL</a>,我可以为搜索词提供的只是这部分http://thing.place.com/r.htm?e=842697&s。是否允许使用通配符?这样我就可以只搜索整个onclick 中可能包含的字符串的一部分?
    • 上面的 CSS 选择器链接显示了如何使用通配符,例如:"~"、"|"、"$"、"*"、"^"。您可以像 [attribute{wildcard}=value] 一样使用它。如果这不起作用,您可能需要查看 DomCrawler::reduce()。最终,一旦你有了价值,你就可以过滤它或做任何你想做的事情。
    猜你喜欢
    • 2019-02-13
    • 1970-01-01
    • 2013-04-02
    • 1970-01-01
    • 2012-12-27
    • 2010-11-11
    • 1970-01-01
    • 2014-03-22
    • 1970-01-01
    相关资源
    最近更新 更多