
PHPで、URL抽出をしたいと思っています。
たとえば、gooのブログ検索などの検索エンジンを利用して、
そこから返されたURLの取得、
もしくは返されたHTMLのソース取得の
どちらかをしたいと思っています。
つまり、既存の検索エンジンを利用したいと思っているのですが・・・
とりあえずこんなHTMLをかいたのですが。
______________________________________________________________________________
<form method="get" action="http://blog.search.goo.ne.jp/search_goo/result/" id="query_top">
<label for="searchtop">検索:</label>
<input type="text" name="MT" value="" id="searchtop" size="45">
スコア
<select name="rm">
<option value = '0'>全部</option>
<option value = '1' selected>1 以上</option>
<option value = '2'>2 以上</option>
<option value = '3'>3 以上</option>
<option value = '4'>4 以上</option>
<option value = '5'>5 以上</option>
</select>
<input type="submit" name="btn_g" class="gbbtn_search" value="gooブログ検索"></form>
_____________________________________________________________________________________
これはただHTMLでフォームを作って、gooにキーワードを飛ばすだけなのですが、
この後表示される(帰ってくる)URLをPHPなどで取得することはできないでしょうか?
取得して、違うプログラムで利用したいと考えています。
しかし、個人的に色々考えたのですが、PHPだと物理的に無理な気がしてきました。
ただ、HTMLに埋め込むならPHPがいいのかなと思いました。
だれかわかる人いますでしょうか?どうかPHPに精通している方、ぜひ宜しくお願いしますm(_ _)m
No.7ベストアンサー
- 回答日時:
yyr446です。
<<自作サーバで以上を正常に動作させられないのですが、
PHPの設定で必要なことってありますでしょうか?>>
自作サーバ? windows or lynux or other バージョン?
私のは
http://www.my-sv.net/server.shtml
のレンタルサーバーです。
別途質問を起てた方が回答がつきやすいと思います。
No.6
- 回答日時:
No1,No2,No3の連続回答者です(申し訳ない。
)結局、私もよそでも質問して、日本語を正しくパースできるような
サンプルにする事ができましたので、一応載せておきます。
※リクエストのパラメーター以外は全部UTF-8にして処理しています。
※リンク部分の取得はXpathのクエリーを使って簡潔にしました。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja-JP">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>GooSarch PHP</title>
</head>
<body>
<form method="get" action="<?php echo $_SERVER["PHP_SELF"];?>" id="query_top">
<label for="searchtop">検索:</label>
<input type="text" name="MT" value="" id="searchtop" size="45">
スコア
<select name="rm">
<option value = '0'>全部</option>
<option value = '1' selected>1 以上</option>
<option value = '2'>2 以上</option>
<option value = '3'>3 以上</option>
<option value = '4'>4 以上</option>
<option value = '5'>5 以上</option>
</select>
<input type="submit" name="btn_g" class="gbbtn_search" value="gooブログ検索"></form>
<hr>
<?php
mb_internal_encoding("UTF-8");
$url="http://blog.search.goo.ne.jp/search_goo/result/";
$parm=rawurldecode(http_build_query($_GET));
$parm=mb_convert_encoding($parm,"EUC-JP","auto");
$uri =($url . "?" . $parm);
$data=file_get_contents($uri);
$data=mb_convert_encoding($data,"UTF-8","EUC-JP");
$data = str_replace ("euc-jp","utf-8",$data);
$data = str_replace ("&","&",$data);
$data = str_replace ("<!--龠龠龠-->","<!--binyu-->",$data);
$dom = new DOMDocument();
@$dom->loadHTML($data);
$dom->normalize();
$xpath = new DOMXPath($dom);
$query = '//div[@id="incontents"]//div[@class="group_time_box"]//li/div[@class="title"]/a[1]';
$entries = $xpath->query($query);
foreach($entries as $entry){
echo '<a href="' . $entry->getAttribute('href') . '">'.$entry->textContent.'</a>' .'<br>';
}
?>
</body>
</html>
この回答への補足
すみません、たいへんありがとうございます。
前回のソースの理解勉強をしていたところです。
やはり日本語処理は難しいですね…。
こちらも早速解読していきたいと思います。
本当にすごいと思いつつ、感謝感謝です。
しばらく経ってからですみません。
自作サーバで以上を正常に動作させられないのですが、
PHPの設定で必要なことってありますでしょうか?(モジュールなど)
レンタルサーバではしっかり動きました!ありがとうございました!!
DOMか何かでPHPがウマく動かないのかもしれません…
最後の最後まですみませんです…
No.5
- 回答日時:
回答者yyr446です。
No.3の補足への回答です。<変なURLが出力されました。どうやら文字化けした「罍」という漢字の検索結果?のようなものが出てしまいました…(泣)>
ですが、変ではありません。
HTTPで通信する時、日本語や特殊文字はは%xx%xx...みたいにエンコードし
ます。
(ブラウザーはアドレス欄やサブミットメソッドを自動でエンコードします)。
NO.2のプログラムは文字コードをUTF-8で保存してあります。
私のphpは内部エンコードがUTF-8となっています。htmlのメタタグ
でもcharset=UTF-8"としてあり、出力はUTF-8になっています。
従ってフォームでGETされるパラメータはUTF-8の文字コードの漢字
を%エンコードされた物です。これをphpの$_GETで参照すると
%がデコードされたUTF-8の漢字になります。(この辺が私もよくわからん)
次に、検索用URIを作るために、http_build_query()関数を使います。
これがUTF-8の漢字を%エンコードしなおします。
それをそのままechoするなら漢字は出ません。
検索先のgooのページはUTF-8のリクエストを受けてくれますが、
出力はgooのページですから当然別の文字コード"EUC-JP"です。
これを自分のページ内に無理やり出すため、
echo mb_convert_encoding(urldecode(htmlspecialchars($data)),"UTF-8","auto");
で、UTF-8に直して、かつタグの影響を受けないようhtmlspecialchars()
もやっています。
それからNo.4のサンプルは、やはり文字コードの取り扱いをまったく
考慮してないので、とりあえず参考にとどめておいて下さい。
No.4
- 回答日時:
適当ですが、返されたHTMLから、検索結果のリンクの部分だけ
抜き出すようにDOMクラスを使って作ってみました。
(日本語文字コードのハンドリングがでたらめになってしまっている!)
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja-JP">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP">
<title>GooSarch PHP</title>
</head>
<body>
<form method="get" action="<?php echo $_SERVER["PHP_SELF"];?>" id="query_top">
<label for="searchtop">検索:</label>
<input type="text" name="MT" value="" id="searchtop" size="45">
スコア
<select name="rm">
<option value = '0'>全部</option>
<option value = '1' selected>1 以上</option>
<option value = '2'>2 以上</option>
<option value = '3'>3 以上</option>
<option value = '4'>4 以上</option>
<option value = '5'>5 以上</option>
</select>
<input type="submit" name="btn_g" class="gbbtn_search" value="gooブログ検索"></form>
<hr>
<?php
$url="http://blog.search.goo.ne.jp/search_goo/result/";
$parm=rawurldecode(http_build_query($_GET));
$parm=mb_convert_encoding($parm,"EUC-JP","auto");
$uri =($url . "?" . $parm);
$data=file_get_contents($uri);
$dom = new DOMDocument();
$dom->encoding="EUC-JP";
@$dom->loadHTML($data);
$doc=$dom->documentElement;
$nodes=$doc->getElementsByTagName('div');
foreach ($nodes as $node) {
if($node->getAttribute('id') =="incontents"){
$incontents = $node->getElementsByTagName('div');
foreach ($incontents as $node){
if($node->getAttribute('class') == "group_time_box"){
$li = $node->getElementsByTagName('li');
foreach($li as $node){
$div=$node->getElementsByTagName('div');
foreach($div as $node){
if($node->getAttribute('class')=="title"){
$link=$node->getElementsByTagName('a');
$a=$link->item(0);
echo '<a href="' . $a->getAttribute('href') . '">' .$a->textContent. '</a>' .'<br>';
echo '<a href="' . $a->getAttribute('href') . '"></a>' .'<br>';
}
}
}
}
}
}
}
?>
</body>
</html>
No.3
- 回答日時:
#No2の回答の
$parm=rawurldecode(http_build_query($_GET));
は余分です。(消し忘れ)
この回答への補足
引き続き、失礼します。
回答2のソースを試してみました。
最後までやらずに、とりあえず$uriを出力させてみました。
_________________________________________
(略)~
<option value = '3'>3 以上</option>
<option value = '4'>4 以上</option>
<option value = '5'>5 以上</option>
</select>
<input type="submit" name="btn_g" class="gbbtn_search" value="gooブログ検索"></form>
<hr><pre>
<?php
$url="http://blog.search.goo.ne.jp/search_goo/result/";
$parm=rawurldecode(http_build_query($_GET));
$parm=http_build_query($_GET);
$uri =($url . "?" . $parm);
echo $uri;
__________________________________________
ですが、inputのボタンを押す前にphpが一部実行されてしまっているのか、
最初の表示だけの時点で、文字化けが起きました。
また、フォームにキーワードを入力してボタンを押してからは、
フォームの下に、~/result/?に続いてにURLが表示されたのですが、
変なURLが出力されました。↓
http://blog.search.goo.ne.jp/search_goo/result/? …
どうやら文字化けした「罍」という漢字の検索結果?のようなものが出てしまいました…(泣)
検索ボタンを押下するまえに文字化けしているのも気になりますし・・・
actionの中にPHPを埋め込むというのは考えていませんでしたが、
この辺りで値渡しが上手くいってないのでしょうか…?
(PHPで文字化けは良くあることですが…)
すごくあと一息な感じはするのですが…。
新しい回答ありがとうございました。
DOMクラスというのがわからないのですが、とりあえず見させて頂きます。
No.2
- 回答日時:
formのaction属性を自分自身にしてキーを受け取り、
file_get_contents()関数でURLとキーをセットしたURI指定を指定して
取得したhtmlを変数に格納できます。
これをパースしてurl部分を取り出せばよいと思います。
(変数に格納するまでのサンプル)
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja-JP">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>GooSarch PHP</title>
</head>
<body>
<form method="get" action="<?php echo $_SERVER["PHP_SELF"];?>" id="query_top">
<label for="searchtop">検索:</label>
<input type="text" name="MT" value="" id="searchtop" size="45">
スコア
<select name="rm">
<option value = '0'>全部</option>
<option value = '1' selected>1 以上</option>
<option value = '2'>2 以上</option>
<option value = '3'>3 以上</option>
<option value = '4'>4 以上</option>
<option value = '5'>5 以上</option>
</select>
<input type="submit" name="btn_g" class="gbbtn_search" value="gooブログ検索"></form>
<hr><pre>
<?php
$url="http://blog.search.goo.ne.jp/search_goo/result/";
$parm=rawurldecode(http_build_query($_GET));
$parm=http_build_query($_GET);
$uri =($url . "?" . $parm);
$data=file_get_contents($uri);
//下で、とりあえず取り込んだhtmlファイルの中身を全部出力してます。
echo mb_convert_encoding(urldecode(htmlspecialchars($data)),"UTF-8","auto");
?>
</pre>
</body>
</html>
この回答への補足
3連続投稿ありがとうございます!!
本当にすごいです!神降臨って感じがしてます!
ソース読んでいてわからないところだらけなので、
ちょっと自分で解釈してきてみます。
宜しければもうしばらくお付き合い頂けたらと思います(汗)
最終的には、この取得したurlのhtmlをテキストか何かに落として、
更にHTMLテキスト検索をしたいと思っているのです。
本当にありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PHP・MySQL・javascriptを用い...
-
HTMLで前の画面に戻る時、入力...
-
DBの値をチェックボックスに反...
-
チェックボックスを使った複数...
-
なぜ、unexpected T_VARIABLEに...
-
エラーを元の画面に表示させるには
-
テキストリンクをPOST送信したい
-
Submit(送信ボタン)を押した...
-
PHPでフォームデータをサンクス...
-
$_SERVER['REQUEST_METHOD']と"...
-
アップロードの際にファイルパス
-
検索時の選択内容を保持する方法
-
処理後のページ内移動について
-
PHPのエラーの解消法について教...
-
【HTML(PHP?)】複数のフォーム...
-
POSTやGETの変数をフォーム無し...
-
POSTの項目に追加
-
phpで、フォームのラジオボタン...
-
PHPでURLにジャンプするには?
-
DB接続やInsertでのエラーを画...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
<select>文、foreachと初期値設定
-
複数 selectフォームから今回on...
-
vb2005のcomboboxについて
-
PHPとpostgreSQL プルダウンの作成
-
multipleを使用するとプルダウ...
-
[PHPとHTML]リストボックスにつ...
-
現在時刻を反映させた時刻のプ...
-
<select>の値によってclassを変...
-
セレクトしたときに全て初期状...
-
phpの変数について
-
local環境でのテストで、FORMタ...
-
2つのプルダウンメニュから受け...
-
既存エンジンを利用したHTML&P...
-
phpの質問です
-
PHP プルダウンメニュー
-
コンボボックス(プルダウン)...
-
プルダウンで選択された値を保持
-
PHPでセレクトメニュー
-
ホームページのセレクトメニュ...
-
多次元配列の値が変わってしま...
おすすめ情報