質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

6363閲覧

simple_html_domでのスクレイピングについて

tennensui0901

総合スコア21

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

3クリップ

投稿2015/04/06 15:07

はじめまして。お世話になります。
現在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ページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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

koyhoge

総合スコア268

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tennensui0901

2015/04/09 11:34

ご回答ありがとうございます。 時間が取れずまだ試せておりませんがご回答内容の結果から 実現可能に見えますので一度締め切らせて頂きます。 またわからないことがありましたら投稿させて頂くことも あると思いますのでその時もどうぞよろしくお願いします。 長期に渡りお付き合い頂きましてありがとうございました。
guest

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

koyhoge

総合スコア268

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tennensui0901

2015/04/07 09:03

出来ました!ありがとうございます! set_callback関数というものがあるのですね。 file_get_htmlについて調べていたのですがWebでは見つけることが出来ておらず、 ソースコードから逆に読み解くこともできなくて。。 もしよろしければ後学のためにお教えいただきたいのですが、以下のようなことも実現可能でしょうか。 ①<div class="content">自体の削除 ②特定文字列の削除、置換 ■結果 ---------------------------------------------------------------------- <p>ぱぴぷぺぽ</p> <p>かきくけこ</p> ---------------------------------------------------------------------- よろしくお願いします。
koyhoge

2015/04/08 03:24

> ①<div class="content">自体の削除 の意味がちょっと分からないのですが、例えば ```lang-html <div class="content"> <p>あいうえお</p> <a href="http://AAAA.com">AAAA</a> <p>かきくけこ</p> </div> <p>さしすせそ</p> ``` のときに ```lang-html <p>さしすせそ</p> ``` にするということですか?
tennensui0901

2015/04/08 13:21

ご回答ありがとうございます。 ①の意味はご認識の通り、<div class="content">~</div>の削除です。 よろしくお願いします。
guest

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

at1994

総合スコア202

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

at1994

2015/04/06 17:22

回答ソースコードで、str_get_htmlに渡している文字列の終了タグに「/」が付いてませんでした、すみません。 <ソースコード> $html = str_get_html("<a>teratail</a>"); 〜 echo $value[0]->plaintext; <実行結果 > teratail <ソースコード> echo $value[0]; <実行結果> <a>teratail</a>
tennensui0901

2015/04/06 20:11

ご回答ありがとうございます。 説明が不足していました。済みません。 対象URLのHTMLと結果は以下のようなものを想定しています。 ■対象URLのHTML ---------------------------------------------------------------------- <div class="content"> <p>あいうえお</p> <a href="http://AAAA.com">AAAA</a> <p>かきくけこ</p> </div> ---------------------------------------------------------------------- ■結果 ---------------------------------------------------------------------- <p>あいうえお</p> <p>かきくけこ</p> ---------------------------------------------------------------------- 引き続きよろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問