simple_html_domで複数URLを処理したい。


複数のURL(HTMLファイル)を配列に格納して、
find関数を使ってa要素を取り出したいのですが、
うまくいきません。

私の書いたプログラムファイルと対象となるファイルは
http://1811way.com/work008/test-sample.txt
です。

結果は、
「グーグルですYahoo!ですamazonです」
(&それぞれのトップページへリンク)
が得られればいいのですが、できません。

私の環境は
PHP5.3.8&MySQL5.5(localhostの環境でapache2.2&Windows7)

test.php を直していただけると助かります。
よろしくお願いします。

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2014/04/20 11:53:33
  • 終了:2014/04/20 15:23:25

ベストアンサー

id:snow0214 No.3

snow0214回答回数470ベストアンサー獲得回数1162014/04/20 13:04:41

ポイント200pt

回答リクエストをもらいました。

基本的にはgizmo5さんの回答と同じですが、file_get_html()を繰り返し利用するときはメモリリークが発生し、そのまま続けると「セグメンテーション違反です」「zend_mm_heap corrupted」が発生してPHPプロセスが停止してしまうので、その回避のために意図してメモリを解放する必要があります。

<?php
include_once('simple_html_dom.php'); 

$list =  array(
    'a1.html',
    'a2.html',
    'a3.html'
);

foreach ($list as $url) {
    $html = file_get_html($url);
    $items  = $html->find('a');
    foreach ($items as $item) {
        echo $item;
    }
    $html->clear();  //オブジェクトに含まれる全ての要素を削除
    unset($html);    //オブジェクトを削除
}
?>
id:kohhi

早速お返事いただきありがとうございました。出来ました。

2014/04/20 15:22:26

その他の回答(2件)

id:gizmo5 No.1

gizmo5回答回数484ベストアンサー獲得回数1382014/04/20 12:45:43

ポイント50pt

file_get_html は、ひとつの URL や文字列を処理するようになっているので、複数の URL を処理する場合にはループで回してあげる必要があります。

http://simplehtmldom.sourceforge.net/manual_api.htm

object file_get_html ( string $filename )Creates a DOM object from a file or a URL.

ループの回し方と Aタグの内容の取り方はいろいろありますが、このような処理になると思います。

<?php
include_once('simple_html_dom.php'); 

$list =  array(
	'a1.html',
	'a2.html',
	'a3.html'
);

foreach($list as $url){
	$html = file_get_html($url);

	$items  = $html->find('a');

	foreach($items as $item){
		echo $item;
	}
}

?>
id:kohhi

早速お返事いただき、ありがとうございました。

2014/04/20 15:21:43
id:psne No.2

ぽけっとしすてむ回答回数441ベストアンサー獲得回数2362014/04/20 12:55:43

ポイント50pt

ソースを見ると、'$list'というURLを探しに行く感じではないでしょうか。


foreach($list as $value){
  $html = file_get_html($value); //読みに行く
  array_push($items , $html->find('a') );
  // file_get_htmlの初期化が必要であれば、ここで行う
}

foreach($items as $item){
	echo $item;
}


id:kohhi

早速お返事いただきありがとうございました。

2014/04/20 15:22:10
id:snow0214 No.3

snow0214回答回数470ベストアンサー獲得回数1162014/04/20 13:04:41ここでベストアンサー

ポイント200pt

回答リクエストをもらいました。

基本的にはgizmo5さんの回答と同じですが、file_get_html()を繰り返し利用するときはメモリリークが発生し、そのまま続けると「セグメンテーション違反です」「zend_mm_heap corrupted」が発生してPHPプロセスが停止してしまうので、その回避のために意図してメモリを解放する必要があります。

<?php
include_once('simple_html_dom.php'); 

$list =  array(
    'a1.html',
    'a2.html',
    'a3.html'
);

foreach ($list as $url) {
    $html = file_get_html($url);
    $items  = $html->find('a');
    foreach ($items as $item) {
        echo $item;
    }
    $html->clear();  //オブジェクトに含まれる全ての要素を削除
    unset($html);    //オブジェクトを削除
}
?>
id:kohhi

早速お返事いただきありがとうございました。出来ました。

2014/04/20 15:22:26

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません