2016-08-08 17 views
0

html要素を1:1で連続的に取り込もうとしている迷惑行為コードは、stylesclassesのないタグ付きです。プラス、私はimagesGoutteを使用して連続して画像、リンク、テキストをスクラップ

$client = new Client(); 

    $crawler = $client->request('GET', 'http://www.tutorialspoint.com/laravel/laravel_ajax.htm'); 

    $crawler->filter('h1, h2, h3, h4, h5, h6, p, pre, p > img, div > img, p > a')->each(function(Crawler $node, $i){ 
     if ($node->filter('p')){ 
      echo $node->text()."<br/>"; 

     } else if ($node->filter('pre')) { 
      echo '<code>'.$node->html().'</code><br/>'; 
     } 
    }); 

しかし、何でも私は、私はそのページに$node->html()を使用するとき、私はそのページに$node->text()またはすべてのHTMLを使用した場合、私はどちらかだけのテキストを取得しています取得に失敗しています。

私は、例えばp - <p>Text Here</p>を取得しようとしています。 img-<img src="default.jp"/>

答えて

1

filterの戻り値はCrawlerオブジェクトであるため、else ifは呼び出されないため、$node->filter('p')行は常にtrueを返します。
クローラにノードがあるかどうか確認する場合は、count()関数を使用できます。

はあなたのコードについては - 私はこれがあなたがやっていることであるなぜのでわからないんだけど、基本的にはあなたのコードが何をするのか、現在の要素が<p>子要素を持っているかどうかを確認です(あなたが何をしようとしているということですdo?)、もしあれば、親のノードテキストの内容を表示する。

あなたはのtextContent(コンテンツを取得、nodeName(==タグ名)を確認することができます

$node->getNode(0)` 

と、このノードを使用して使用することができますクローラ($node)からノードをDOMElementのを取得するためには、

$crawler = $client->request('GET', 'http://www.tutorialspoint.com/laravel/laravel_ajax.htm'); 

$crawler->filter('h1, h2, h3, h4, h5, h6, p, pre, p > img, div > img, p > a')->each(function(Crawler $node, $i){ 
    if (in_array($node->getNode(0)->nodeName, ['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'p', 'a'])) { 
     echo "{$node->getNode(0)->nodeName} => {$node->getNode(0)->textContent}.<br/>\n"; 
    } elseif ($node->getNode(0)->nodeName == 'pre') { 
     echo "pre => <code>".$node->html()."</code><br/>\n"; 
    } elseif ($node->getNode(0)->nodeName == 'img') { 
     echo 'img => src="'.$node->getNode(0)->getAttribute('src')."\" <br/>\n"; 
    } 
}); 
+0

こんにちは、答えてくれてありがとう:ここではタグ等)、

は、使用できる例です。それは本当に多くの助けになりました。しかし、私はまだリンクや画像の場合に問題があります。例えば、私が掻いているページが 'example.com'で、画像がある場合、' ' - >' img => src = http://example.com/default .jpg' –

+0

'$ domain'と' $ node-> getNode(0) - > getAttribute( 'src') 'を組み合わせることはできますが、ディレクトリ構造やトラバースなどのいくつかの項目をチェックする必要があるかもしれないことに注意してください。 。 – Dekel

+0

私はそれのための解決策をここに見つけました - http://stackoverflow.com/a/8573193/3866364。とにかく、答えをありがとう。 :) –

関連する問題