a.phpを作ったのですが
diff.txtに思った通りのテキストを出力せずnew.txtとおなじものを抽出します
どこを改良すれば diff.txtに差分テキストが表示されるようになるのでしょうか?
教えてください
a.php
**************
<?php
mb_language("Japanese");
mb_internal_encoding("utf-8");
$str = file_get_contents("http://headlines.yahoo.co.jp/hl");
$str = mb_convert_encoding($str, "utf-8", "auto");
preg_match("/<ul id=\"gnSec\">(.+?)<\/ul>/ismu", $str, $arr);
$patterns = array();
$patterns[0] = "/^<meta.*\n/mu";
$replacements = array();
$replacements[0] = '';
$sResult = preg_replace($patterns, $replacements, $arr[1]);
file_put_contents("new.txt", $sResult);
$file_new = file("new.txt", FILE_IGNORE_NEW_LINES);
$file_old = file("old.txt", FILE_IGNORE_NEW_LINES);
$result = array_diff($file_new , $file_old);
file_put_contents("diff.txt", join("\n", $result));
?>
**************
old.txt
**************
<li><a href="http://headlines.yahoo.co.jp/hl?c=flash">速報</a></li>
<li><a href="http://headlines.yahoo.co.jp/hl?c=dom">国内</a></li>
**************
他人の作ったデータをスクレイピングするには、(現状は)実際にどんなデータが取得できているのかを把握するのが最初です。
質問者さんの取得したいデータは、本当に「http://headlines.yahoo.co.jp/hl」のものでしょうか?
だとしたら、id="gnSec" の ul には meta は存在せず、単純な li が並んでいるので $arr[1] から $sResult を作っている preg_replace() は不要ですね。
そして、実際に取得できたデータ( new.txt へ保存したもの)をエディタで確認されていますか?
そして、 old.txt に予め書いておいたデータ(ですよね?)と同じ書式になっていますか?
ご確認頂ければすぐに解りますが、各行の先頭にスペースが8個存在します。
これを除去するのはいろいろ方法がありますけど、せっかく複数の置換が出来るように用意しているので、
$patterns[1] = '/\s*\n\s*/';
$replacements[1] = "\n";
とでもするのはいかがでしょうか。
__改行文字の前後に複数の空白系文字がある場合は一つの改行だけにする
データの先頭に改行が入っているのが気持ち悪いので、同様に正規表現を追加して削除するか、$arr[1] か $sResult のどちらかを trim() または ltrim() で削除したらどうでしょうか?
$sResult の生成時に、不要な部分を削除するのではなく、必要な部分を取り出す方が良かったのかもしれません。
(以下蛇足)
先の質問 http://q.hatena.ne.jp/1365680308
①http://q.hatena.ne.jp/1365606294 と②http://q.hatena.ne.jp/1365546701 の質問の続きです
...
①だけのphp ②だけのphp を実行した場合はうまく動作ました。
にはこうありますが、「うまく動作した」のなら、質問は解決したはずです。それを放置したままというのは如何なものでしょう?
<?php mb_language("Japanese"); mb_internal_encoding("utf-8"); $str = file_get_contents("http://headlines.yahoo.co.jp/hl"); $str = mb_convert_encoding($str, "utf-8", "auto"); preg_match("/<ul id=\"gnSec\">(.+?)<\/ul>/ismu", $str, $arr); $patterns = array(); $patterns[0] = "/^<meta.*\n/mu"; $replacements = array(); $replacements[0] = ''; $sResult = preg_replace($patterns, $replacements, $arr[1]); file_put_contents("new.txt", $sResult); $file_new = file("new.txt", FILE_IGNORE_NEW_LINES); $file_old = file("old.txt", FILE_IGNORE_NEW_LINES); mb_convert_variables( 'UTF-8' , 'auto' , $file_old ); $result = array_diff($file_new , $file_old); file_put_contents("diff.txt", join("\n", $result)); ?>
これでどうでしょうか?
他人の作ったデータをスクレイピングするには、(現状は)実際にどんなデータが取得できているのかを把握するのが最初です。
質問者さんの取得したいデータは、本当に「http://headlines.yahoo.co.jp/hl」のものでしょうか?
だとしたら、id="gnSec" の ul には meta は存在せず、単純な li が並んでいるので $arr[1] から $sResult を作っている preg_replace() は不要ですね。
そして、実際に取得できたデータ( new.txt へ保存したもの)をエディタで確認されていますか?
そして、 old.txt に予め書いておいたデータ(ですよね?)と同じ書式になっていますか?
ご確認頂ければすぐに解りますが、各行の先頭にスペースが8個存在します。
これを除去するのはいろいろ方法がありますけど、せっかく複数の置換が出来るように用意しているので、
$patterns[1] = '/\s*\n\s*/';
$replacements[1] = "\n";
とでもするのはいかがでしょうか。
__改行文字の前後に複数の空白系文字がある場合は一つの改行だけにする
データの先頭に改行が入っているのが気持ち悪いので、同様に正規表現を追加して削除するか、$arr[1] か $sResult のどちらかを trim() または ltrim() で削除したらどうでしょうか?
$sResult の生成時に、不要な部分を削除するのではなく、必要な部分を取り出す方が良かったのかもしれません。
(以下蛇足)
先の質問 http://q.hatena.ne.jp/1365680308
①http://q.hatena.ne.jp/1365606294 と②http://q.hatena.ne.jp/1365546701 の質問の続きです
...
①だけのphp ②だけのphp を実行した場合はうまく動作ました。
にはこうありますが、「うまく動作した」のなら、質問は解決したはずです。それを放置したままというのは如何なものでしょう?
実行環境をcoreserverからサクラレンタルサーバーに移動しましたらいけました。
ありがとうございました。
実行環境をcoreserverからサクラレンタルサーバーに移動しましたらいけました。
2013/04/13 22:24:20ありがとうございました。