はじめまして。お世話になります。
現在PHPサイトを作成しており、simple_html_domを使用した特定URLからの
スクレイピングについて教えて頂きたく投稿します。
やりたいことは以下の内容です。
①URL先の特定タグの中身の取得。
②その中から<a>、<img>タグを削除。
③上記内容を表示。
現在、①までは出来たのですが、②でのタグ削除が出来ずに困っています。
ご存知の方がいらっしゃいましたらご教授の程、よろしくお願いします。
以下、ソース内容です。
<?php include_once('simplehtmldom_1_5/simple_html_dom.php'); // インクルード $html = file_get_html( 'http://XXXXXX.html' ); // 対象URLの指定 foreach($html->find('div[class="content"]') as $element){ // 内容を取得 echo $comment . '<br>'; // 表示 } ?>気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ベストアンサー
コメントでは Markdown が使えないようなので、新たに回答を立てます。
入力は以下の sample.html が前提です。
lang
1<div class="content"> 2<p>あいうえお</p> 3<a href="http://AAAA.com">AAAA</a> 4<p>かきくけこ</p> 5</div> 6<p>さしすせそ</p>
(1) <div class="content">自体の削除
これは単純に find で見つかったノードの outertext を空にしてやればよいです。
lang
1<?php 2require_once 'simple_html_dom_1_5/simple_html_dom.php'; 3$html = file_get_html('sample.html'); 4foreach ($html->find('div[class="content"]') as $elem) { 5 $elem->outertext = ''; 6} 7echo (string)$html;
で出力は以下になります。
lang
1<p>さしすせそ</p>
(2) 特定文字列の削除、置換
こっちは、以前のコールバック関数に文字列置換を追加してやれば良さそうです。
改行コードを残すために $stripRN を false にしてみました。
lang
1<?php 2require_once 'simple_html_dom_1_5/simple_html_dom.php'; 3$html = file_get_html('sample.html', 4 false, null, -1, -1, true, true, DEFAULT_TARGET_CHARSET, false); 5 6$html->set_callback(function($element) { 7 if ($element->tag == 'img' || $element->tag == 'a') { 8 $element->outertext = ''; 9 } 10 if ($element->tag == 'p' && $element->innertext == 'あいうえお') { 11 $element->innertext = 'ぱぴぷぺぽ'; 12 } 13}); 14 15foreach ($html->find('div[class="content"]') as $elem) { 16 echo $elem->innertext; 17}
これの出力は以下になりました。
lang
1 2<p>ぱぴぷぺぽ</p> 3 4<p>かきくけこ</p>
投稿2015/04/08 14:01
総合スコア268
0
以下のように set_callback メソッドを使って img と a タグの出力を空にすると、それを除いたエレメントだけになりますね。
lang
1require_once 'simplehtmldom_1_5/simple_html_dom.php'; 2 3$html = file_get_html('sample.html'); 4 5$html->set_callback(function($element) { 6 if ($element->tag == 'img' || $element->tag == 'a') { 7 $element->outertext = ''; 8 } 9}); 10 11foreach ($html->find('div[class="content"]') as $elem) { 12 echo $elem->innertext; 13}
これを実行すると
lang
1<p>あいうえお</p> <p>かきくけこ</p>
という出力が得られます。改行を残したいのならば、file_get_html() の引数 $stripRN を false に指定しましょう。
投稿2015/04/06 23:23
総合スコア268
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/04/08 03:24
2015/04/08 13:21
0
タグの削除というのは、例えば
lang
1<a>teratail</a>
の場合、「teratail」だけを抽出したいという事ですか?
であれば
lang
1 2<?php 3 4require_once("simple_html_dom.php"); 5 6//simple html dom オブジェクト生成 7//テスト用に文字列からオブジェクトを生成しています 8//urlからの生成はfile_get_htmlを使用して下さい 9$html = str_get_html('<a>teratail<a>'); 10//aタグで抽出 11$value = $html->find("a"); 12 13echo $value[0]->plaintext; 14 15?>
とすれば「teratail」だけ抽出できます。
ブラウザから開き、ソースを参照した時の結果です。
![イメージ説明]WIDTH:55
ちなみに、
lang
1<?php 2 3require_once("simple_html_dom.php"); 4 5//simple html dom オブジェクト生成 6//テスト用に文字列からオブジェクトを生成しています 7//urlからの生成はfile_get_htmlを使用して下さい 8$html = str_get_html('<a>teratail<a>'); 9//aタグで抽出 10$value = $html->find("a"); 11 12echo $value[0]; 13 14?>
とすると、
![イメージ説明]WIDTH:101
となります。
参照できるのは、
plaintext : textのみ抽出
innertext : タグ情報を含めたデータを抽出
outertext : まるごと抽出
のようです。
投稿2015/04/06 17:17
総合スコア202
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/04/06 17:22
2015/04/06 20:11
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/04/09 11:34