Goutte - dom crawler - 删除节点

时间:2014-10-13 18:24:12

标签: php symfony dom web-crawler goutte

我的网站上有html(http://testsite.com/test.php):

<div class="first">
  <div class="second">
     <a href="/test.php">click</a>
     <span>back</span>
  </div>
</div>
<div class="first">
  <div class="second">
     <a href="/test.php">click</a>
     <span>back</span>
  </div>
</div>

我想收到:

<div class="first">
  <div class="second">
     <a href="/test.php">click</a>
  </div>
</div>
<div class="first">
  <div class="second">
     <a href="/test.php">click</a>
  </div>
</div>

所以我想删除span。 我在Symfony2中使用Goutte基于http://symfony.com/doc/current/components/dom_crawler.html

    $client = new Client();
    $crawler = $client->request('GET', 'http://testsite.com/test.php');

    $crawler->filter('.first .second')->each(function ($node) {
        //??????
    });

2 个答案:

答案 0 :(得分:3)

作为explained in the docs

  

DomCrawler组件简化了HTML和XML文档的DOM导航。

还有:

  

尽管可能,但DomCrawler组件并非设计用于操纵DOM或重新转储HTML / XML。

DomCrawler旨在从DOM文档中提取细节而不是修改它们。

<强>然而...

由于PHP通过引用传递对象,而 Crawler 基本上是DOMNode的包装器,因此在技术上可以修改底层DOM文档:

// will remove all span nodes inside .second nodes
$crawler->filter('html .content h2')->each(function (Crawler $crawler) {
    foreach ($crawler as $node) {
        $node->parentNode->removeChild($node);
    }
});

以下是一个有效的例子:https://gist.github.com/jakzal/8dd52d3df9a49c1e5922

答案 1 :(得分:0)

To remove a node the anonymous function must return false.

只需在闭包内返回false,$节点就会被删除。