2

私はこのHTMLを持っています:

<div class="body">
   <p>Some text 1</p>
   <h2>Header 2</h2>
   <p>Actual content</p>
</div>

私はそれを除いてすべてを取得したい<h2>ので、次のようになります:

<p>Some text 1</p>
<p>Actual content</p>

これを達成しようとしています:

$crawler = new Crawler( $html );

$body = $crawler->filter( 'div.body' );
$body->rewind();
$body = $body->current();

$h2 = $crawler->filter('h2');
$h2->rewind();
$h2 = $h2->current();

$body->removeChild($h2);

しかし、私は得る:

[DOMException] 見つからないエラー

私は何が欠けていますか?

4

3 に答える 3

1

必要なことを行うにはいくつかの方法があります。

1 クラスとPタグで絞り込む

HTML の例から、次のコードを使用できます。

$crawler = new Crawler( $html );

$result = $crawler->filter( 'div.body > p' )->each(
    function (Crawler $node, $i) {
        return $node->text();
    }
);

echo print_r($result, true);

クロージャーの戻り値が配列に配置されることに注意してください。この配列は $result 変数になります。返される配列は次のようになります。

Array
(
    [0] => Some text 1
    [1] => Actual content
)

2 本文を取得し、必要な各要素をフィルタリングします

提供した同じ html を使用して、クラスのみでフィルタリングし、各要素を個別に選択します。

$crawler = new Crawler( $html );
$body = $crawler->filter( '.body' );
echo $body->filter('p')->eq(0)->text() .'<br />';
echo $body->filter('p')->eq(1)->text() .'<br />';

結果は P タグの内容を出力するはずです

Some text 1
Actual content

htmlこのコードから、 の代わりに メソッドを使用してコンテナのコンテンツ全体を取得できますtext

$crawler = new Crawler( $html );
$body = $crawler->filter( '.body' );
echo $body->html();

カスタム ルールに基づいてノードをフィルタリングして domcrawler を取得できるため、Node Filtering Reduceメソッドが役立つ場合があります。

フィルタリング後に必要なノードを取得するためのNode Traversingメソッドも参照してください。

于 2013-10-07T18:44:24.953 に答える
0

(OPに代わって投稿) .

回避策として、SimpleHtmlDomBundle10分で問題を修正しました:)

于 2015-05-20T13:33:21.560 に答える