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

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

ただいまの
回答率

87.93%

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

解決済

回答 3

投稿

  • 評価
  • クリップ 3
  • VIEW 5,230

score 24

はじめまして。お世話になります。
現在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>';                                               // 表示
    }
?>


  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+1

コメントでは Markdown が使えないようなので、新たに回答を立てます。

入力は以下の sample.html が前提です。
<div class="content">
<p>あいうえお</p>
<a href="http://AAAA.com">AAAA</a>
<p>かきくけこ</p>
</div>
<p>さしすせそ</p>

(1) <div class="content">自体の削除
これは単純に find で見つかったノードの outertext を空にしてやればよいです。
<?php
require_once 'simple_html_dom_1_5/simple_html_dom.php';
$html = file_get_html('sample.html');
foreach ($html->find('div[class="content"]') as $elem) {
    $elem->outertext = '';
}
echo (string)$html;
で出力は以下になります。
<p>さしすせそ</p>

(2) 特定文字列の削除、置換
こっちは、以前のコールバック関数に文字列置換を追加してやれば良さそうです。
改行コードを残すために $stripRN を false にしてみました。
<?php
require_once 'simple_html_dom_1_5/simple_html_dom.php';
$html = file_get_html('sample.html',
    false, null, -1, -1, true, true, DEFAULT_TARGET_CHARSET, false);

$html->set_callback(function($element) {
    if ($element->tag == 'img' || $element->tag == 'a') {
        $element->outertext = '';
    }
    if ($element->tag == 'p' && $element->innertext == 'あいうえお') {
        $element->innertext = 'ぱぴぷぺぽ';
    }
});

foreach ($html->find('div[class="content"]') as $elem) {
    echo $elem->innertext;
}
これの出力は以下になりました。
<p>ぱぴぷぺぽ</p>

<p>かきくけこ</p>

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/04/09 20:34

    ご回答ありがとうございます。
    時間が取れずまだ試せておりませんがご回答内容の結果から
    実現可能に見えますので一度締め切らせて頂きます。

    またわからないことがありましたら投稿させて頂くことも
    あると思いますのでその時もどうぞよろしくお願いします。
    長期に渡りお付き合い頂きましてありがとうございました。

    キャンセル

0

タグの削除というのは、例えば
<a>teratail</a>
の場合、「teratail」だけを抽出したいという事ですか?
であれば
<?php

require_once("simple_html_dom.php");

//simple html dom オブジェクト生成
//テスト用に文字列からオブジェクトを生成しています
//urlからの生成はfile_get_htmlを使用して下さい
$html = str_get_html('<a>teratail<a>');
//aタグで抽出
$value = $html->find("a");

echo $value[0]->plaintext;

?>
とすれば「teratail」だけ抽出できます。
ブラウザから開き、ソースを参照した時の結果です。
イメージ説明ちなみに、
<?php

require_once("simple_html_dom.php");

//simple html dom オブジェクト生成
//テスト用に文字列からオブジェクトを生成しています
//urlからの生成はfile_get_htmlを使用して下さい
$html = str_get_html('<a>teratail<a>');
//aタグで抽出
$value = $html->find("a");

echo $value[0];

?>
とすると、
イメージ説明となります。
参照できるのは、
plaintext : textのみ抽出
innertext : タグ情報を含めたデータを抽出 
outertext : まるごと抽出
のようです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/04/07 02:22

    回答ソースコードで、str_get_htmlに渡している文字列の終了タグに「/」が付いてませんでした、すみません。
    <ソースコード>
    $html = str_get_html("<a>teratail</a>");

    echo $value[0]->plaintext;
    <実行結果 >
    teratail

    <ソースコード>
    echo $value[0];
    <実行結果>
    <a>teratail</a>

    キャンセル

  • 2015/04/07 05:11

    ご回答ありがとうございます。
    説明が不足していました。済みません。

    対象URLのHTMLと結果は以下のようなものを想定しています。
    ■対象URLのHTML
    ----------------------------------------------------------------------
    <div class="content">
    <p>あいうえお</p>
    <a href="http://AAAA.com">AAAA</a>
    <p>かきくけこ</p>
    </div>
    ----------------------------------------------------------------------

    ■結果
    ----------------------------------------------------------------------
    <p>あいうえお</p>
    <p>かきくけこ</p>
    ----------------------------------------------------------------------

    引き続きよろしくお願いします。

    キャンセル

0

以下のように set_callback メソッドを使って img と a タグの出力を空にすると、それを除いたエレメントだけになりますね。

require_once 'simplehtmldom_1_5/simple_html_dom.php';

$html = file_get_html('sample.html');

$html->set_callback(function($element) {
    if ($element->tag == 'img' || $element->tag == 'a') {
        $element->outertext = '';
    }
});

foreach ($html->find('div[class="content"]') as $elem) {
    echo $elem->innertext;
}
これを実行すると
<p>あいうえお</p>  <p>かきくけこ</p>
という出力が得られます。改行を残したいのならば、file_get_html() の引数 $stripRN を false に指定しましょう。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/04/07 18:03

    出来ました!ありがとうございます!

    set_callback関数というものがあるのですね。
    file_get_htmlについて調べていたのですがWebでは見つけることが出来ておらず、
    ソースコードから逆に読み解くこともできなくて。。

    もしよろしければ後学のためにお教えいただきたいのですが、以下のようなことも実現可能でしょうか。
    ①<div class="content">自体の削除

    ②特定文字列の削除、置換
    ■結果
    ----------------------------------------------------------------------
    <p>ぱぴぷぺぽ</p>
    <p>かきくけこ</p>
    ----------------------------------------------------------------------

    よろしくお願いします。

    キャンセル

  • 2015/04/08 12: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>
    ```
    にするということですか?

    キャンセル

  • 2015/04/08 22:21

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

    よろしくお願いします。

    キャンセル

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

  • ただいまの回答率 87.93%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る