重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

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

A 回答 (7件)

yyr446です。


<<自作サーバで以上を正常に動作させられないのですが、
PHPの設定で必要なことってありますでしょうか?>>
自作サーバ? windows or lynux or other  バージョン?
私のは
http://www.my-sv.net/server.shtml
のレンタルサーバーです。
別途質問を起てた方が回答がつきやすいと思います。
    • good
    • 0

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 ("&","&amp;",$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>

この回答への補足

すみません、たいへんありがとうございます。
前回のソースの理解勉強をしていたところです。
やはり日本語処理は難しいですね…。
こちらも早速解読していきたいと思います。
本当にすごいと思いつつ、感謝感謝です。

補足日時:2009/10/29 15:16
    • good
    • 0
この回答へのお礼

しばらく経ってからですみません。
自作サーバで以上を正常に動作させられないのですが、
PHPの設定で必要なことってありますでしょうか?(モジュールなど)
レンタルサーバではしっかり動きました!ありがとうございました!!
DOMか何かでPHPがウマく動かないのかもしれません…
最後の最後まですみませんです…

お礼日時:2009/11/10 20:44

回答者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のサンプルは、やはり文字コードの取り扱いをまったく
考慮してないので、とりあえず参考にとどめておいて下さい。
    • good
    • 0

適当ですが、返された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 '&lt;a href="' . $a->getAttribute('href') . '"&gt;' .$a->textContent. '&lt;/a&gt;' .'<br>';
echo '<a href="' . $a->getAttribute('href') . '"></a>' .'<br>';
}
}
}
}
}
}
}
?>
</body>
</html>
    • good
    • 0

#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クラスというのがわからないのですが、とりあえず見させて頂きます。

補足日時:2009/10/23 01:01
    • good
    • 0

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テキスト検索をしたいと思っているのです。
本当にありがとうございます。

補足日時:2009/10/22 22:58
    • good
    • 0

ひとつの方法としては、cURLというモジュールの利用が考えられます。


http://www.php.net/manual/ja/book.curl.php
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!