2

ここでDomcrawlerを使用してこのソリューションを実装するにはどうすればよいですか?

<?php
use Symfony\Component\DomCrawler\Crawler;

$crawler = new Crawler();
$content = file_get_contents('http://example.com/somepage.html');
$crawler->addHtmlContent($content, 'UTF-8');
$content = $crawler->filter('#main-content');

// Remove content by tag and by css selector.

?>
4

4 に答える 4

6
    $crawler = new Crawler($html,$url);

    $document = new \DOMDocument('1.0', 'UTF-8');
    $root = $document->appendChild($document->createElement('_root'));
    $crawler->rewind();
    $root->appendChild($document->importNode($crawler->current(), true));
    $domxpath = new \DOMXPath($document);

    foreach ($selectorsToRemove as $selector) {
        $crawlerInverse = $domxpath->query(CssSelector::toXPath($selector));
        foreach ($crawlerInverse as $elementToRemove) {
            $parent = $elementToRemove->parentNode;
            $parent->removeChild($elementToRemove);
        }
    }
    $crawler->clear();
    $crawler->add($document);
于 2013-06-14T16:35:09.207 に答える
1

ドキュメントで説明されているように:

DomCrawler コンポーネントは、HTML および XML ドキュメントの DOM ナビゲーションを容易にします。

また:

可能な限り、DomCrawler コンポーネントは DOM の操作や HTML/XML の再ダンプ用には設計されていません。

DomCrawler は、DOM ドキュメントを変更するのではなく、詳細を抽出するように設計されています。

でも...

PHP は参照によってオブジェクトを渡し、Crawlerは基本的にDOMNodeのラッパーであるため、基礎となる DOM ドキュメントを変更することは技術的に可能です。

// will remove all divs with a class .toRemove
$crawler->filter('div.toRemove')->each(function ($node) {
    foreach ($crawler as $node) {
        $node->parentNode->removeChild($node);
    }
});

これが実際の例です: https://gist.github.com/jakzal/8dd52d3df9a49c1e5922

于 2015-04-01T21:22:42.150 に答える
1

Crawlerクラスが拡張され\SplObjectStorage、Crawler が HTML を受け取ると、attach()メソッドを使用して各要素をストレージに追加します。

これは、detach()メソッドがクローラー オブジェクトでも使用できることを意味します。以下はテストしていませんが、これでうまくいくと思います。

$crawlerInverse = $crawler->filter('script');

foreach ($crawlerInverse as $elementToRemove) {
    if ($crawler->contains($elementToRemove)) {
       $crawler->detach($elementToRemove);
    }
}
于 2013-06-12T19:08:35.040 に答える
0

次のような一般的な関数を使用します。

function removeCrawlerNode($crawler_node) {

    foreach($crawler_node as $node) {
        $node->parentNode->removeChild($node);
    }
}

次に、検索したいクローラー コードのセクション (class .sample_section など) を見つけ、それが存在する場合は、削除するすべてのタグを含む remove_tag_array を作成します。

if($crawler->filter('.sample_section')->count() > 0) {

    $remove_tag_array = array("br", "b", "img", "div", "u", "i");

    $sub_crawler = $crawler->filter('.sample_section');

    foreach ($remove_tag_array as $tag) {
        $sub_crawler->filter($tag)->each(function ($node) {
            removeCrawlerNode($node);
        });
    }
}
于 2015-06-01T19:41:26.103 に答える