2014-10-13 2 views
3

У меня есть HTML на моем сайте (http://testsite.com/test.php):Goutte - дом гусеничный - удалить узел

<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> 

Так я хотел бы удалить срок. Я использую Goutte в Symfony2 на основе 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) { 
     //?????? 
    }); 

ответ

0

To remove a node the anonymous function must return false.

Просто вернуть ложь внутри затвора и $ узел будет удален.

+0

Внутри _reducer_, а не просто закрытие. –

3

Как explained in the docs:

The DomCrawler component eases DOM navigation for HTML and XML documents.

, а также:

While possible, the DomCrawler component is not designed for manipulation of the DOM or re-dumping HTML/XML.

DomCrawler предназначен для извлечения деталей из DOM-документов, а не изменять их.

Однако ...

Поскольку PHP передает объекты по ссылке, и Гусеничный в основном обертка для 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

+0

Он выдает мне ошибку неопределенной переменной: искатель, тогда у меня есть ($ crawler), но он не работает для меня – Chintan7027

+0

Не работает и для меня. Ради улучшения ответа я бы рекомендовал устранить «$ node» из замыкания и «$ node» из 'foreach()'. Ошибка, которую я получаю ig 'Ошибка: вызов функции-члена removeChild() на null'. Счастливый, чтобы продолжить, как только это будет разрешено, и пример работает. –

+0

Пока ваш пример gist работает, этот пример не связан с вышеупомянутой проблемой param. –