Goutte — dom crawler — удалить узел

У меня есть 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) {
//??????
});

4

Решение

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

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

а также:

Хотя это возможно, компонент DomCrawler не предназначен для манипулирования DOM или повторного дампа HTML / XML.

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

Тем не мение…

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

3

Другие решения

To remove a node the anonymous function must return false.

Просто верните false внутри замыкания, и узел $ будет удален.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector