Goutte - сканер dom - удалить узел

У меня есть 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. Я использую 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) {
        //??????
    });

person Mark888    schedule 13.10.2014    source источник


Ответы (2)


Как объяснено в документации:

Компонент DomCrawler упрощает навигацию по DOM для документов HTML и XML.

а также:

Хотя это возможно, компонент 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

person Jakub Zalas    schedule 01.04.2015
comment
Это выдает мне ошибку неопределенной переменной: искатель, затем я использую ($ Crawler), но у меня это не работает - person Chintan7027; 10.08.2017
comment
У меня тоже не работает. Ради улучшения ответа я бы рекомендовал устранить неоднозначность $node из закрытия и $node из foreach(). Ошибка, которую я получаю ig Error: Call to a member function removeChild() on null. С удовольствием проголосую, как только это будет решено и пример заработает. - person The Onin; 23.02.2018
comment
Хотя ваш основной пример работает, этот пример не связан с вышеупомянутой проблемой с параметрами. - person The Onin; 23.02.2018
comment
Не знаю, что там произошло. Обновил мой ответ правильным примером. Ваше здоровье! - person Jakub Zalas; 23.02.2018

To remove a node the anonymous function must return false.

Просто верните false внутри редуктора, и $node будет удален.

person kaseOga    schedule 21.10.2014
comment
Внутри reducer не просто какое-то замыкание. - person The Onin; 22.02.2018