PHPでHTMLパーサをつくりたい(といっても簡略なもの)

このQ&Aのポイント
  • 質問内容は、PHPを使用して外部のサーバの数万のURLを解析し、ぱんくず(breadcrumb)を抽出してCSVファイルに変換する方法についてです。
  • 質問者は、php4を使用しており、数万のURLを一括DLするか、phpのfoepn関数を使用してURLにアクセスして解析するかを迷っています。
  • 質問者は、一括DLしてもIPで拒否されるリスクがないことを確認しており、効率と速度の観点から、phpのfoepnを使用する方法が適しているかどうか知りたいと思っています。
回答を見る
  • ベストアンサー

PHPでHTMLパーサをつくりたい(といっても簡略なもの)

お世話様です。php4をつかっているのですが(DBはあるけど、やっつけしごとなので、使っていない)、 外部のサーバにアクセスし、 数万のURLに対して、 HTMLを解析し、 そのなかのぱんくず・・・ 「<a href="ほげ">トップ</a> > <a href="ほげ">pc</a> > <a href="ほげ">ノートパソコン</a> > <B>れぼの Thinkpad , XXXX</B>」(すべて1行です) これを、「トップ,pc,ノートパソコン,"Thinkpad , XXXX"」 というようなCSVファイルに変換して、 数万行のURLのCSVに格納したいのですが、どうすれば得策でしょうか? 特に、ぱんくずの解析で悩んでいます。 どのようにすればいいでしょうか? -- あと、 wgetで数万のURLを一括DLして、それから解析したほうが無難かなとおもったのですが、 このへんはどうなのでしょうか? DLせずに、phpのfoepnで数万のURLにアクセスして解析して結果のcsvだけはきだすほうが、 効率・速さなどの点でふさわしいでしょうか? -- P.S. なお、一括DLをしても、IPではじかれることはないことは、保証済みです。 (契約上・・なのかな?とにかくそうらしいです) 以上、お助けいただければ幸いです。よろしくお願いします。

  • PHP
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • racchoman
  • ベストアンサー率71% (20/28)
回答No.1

やっつけ仕事といえば正規表現です。 ぱんくずの形式が固定で、ぱんくず階層が一定数以下(たとえば10階層以下)とかだったら、ゴリゴリ正規表現を書くだけだと思います。どの辺で悩んでいるんでしょうか? wgetを使うかどうかは、どちらでもよいと思いますが、本当に単純にGETしてくるだけだったら、あえてwgetを使う理由は見当たりません。 速度的にはwgetの方が少々遅いんではないかと思います。データを一度ファイルに落とすことになりますし、PHPからwgetを起動するオーバーヘッドもあります。また、wgetはfopenなどよりも複雑なことをするプログラムですので、それも速度に影響するかもしれません。 なので、もし私がやるならば、wgetは使いません。ちゃんとやるならばfsockopen()でタイムアウトや各種のエラーハンドリングなどを実装しますし、そうでなければfile()とかでテキトーに書いてしまいます。

daisuke_ja
質問者

お礼

ご回答ありがとうございます。 なお、質問にて申し上げることを忘れておりました。 申し訳ございません。 追記: ●念のため(ぱんくず解析以外にもなにかしらHTMLに対して作業を行う可能性があるため)に、すべていったんローカルにhtmlファイルたちを落として、それから処理しようと考えています。 >やっつけ仕事といえば正規表現です。 自分、正規表現があまり得意ではない・・・というよりも、できるんですが、失敗(それも失敗とは気付かない)の可能性があるものでして。 >wgetはfopenなどよりも複雑なことをするプログラムですので、それも速度に影響するかもしれません。 確かにそのとおりですね。「man wget」でみるといろいろ書いてありますね・・・。 >ちゃんとやるならばfsockopen()でタイムアウトや各種のエラーハンドリングなどを実装しますし、そうでなければfile()とかでテキトーに書いてしまいます。 なるほどですね。検討してみます。 ありがとうございました。

関連するQ&A

  • PHPでのWaning

    PHPでのWaning PHPファイルにてメッセージ抑止をしたいのですが、どのようにすれば良いのでしょうか? 「ディレクトリトラバーサル」脆弱性とのご指摘を頂いております。 http://xxxx.com/sys/dl.php?file=01(正常なURL) http://xxxx.com/sys/dl.php?file=00(ディレクトリ内に無いURL) 上記のように​http://xxxx.com/sys/dl.php?file=00と言うページが無く (あったとしても見られても問題ない) http://xxxx.com/sys/dl.php?file=01以外のアドレス(?file=)以降、ユーザーがURLの打ち間違えをしたら Waning: file(~):failed to open stream:No such file or directory in....................../utl.php on line 139 が出ます。 上記「Waning」では無く、他のメッセージ(表示URLは変えずにhtmlで出力)を出したいのです。 utl.phpの139行目は $utl = new Utl(); $template = $utl->readTemplate($template_file); $template_file テンプレートファイルへのパス 返り値 $template テンプレートファイル(SJIS) */ function readTemplate($template_file){ (139行目)foreach(file($template_file) as $v){ $template .= $v; } $template = mb_convert_encoding($template, "EUC-JP", "auto"); return $template; } /* どうぞ、よろしくお願い致します。

    • 締切済み
    • PHP
  • 【PHP】正規表現でHTMLを置換したいのですが・・・

    HTMLのソースを、正規表現で置換をしてから画面に出力したいのですが、どのような正規表現を記述すればいいのか分からず困っています。。。。 下記(befor)の4つのリンクのうち、ファイルの拡張子が、pdf、doc、xlsのファイルだけ「download.php」というPHPのプログラムを通してからダウンロードさせるために、文字列を(after)の様に置換をしたいのですが、なかなかうまくいきません。。。 どなたか、ご指導のほど宜しくお願いいたします。 (befor) $html = '<a href="/files/aaaa.pdf">あ</a><br>' . '<a href="/files/cccc.html">い</a><br>' . '<a href="/files/dddd.doc">う</a><br>' . '<a href="/files/eeee.xls">え</a><br>' ; (after) $html = '<a href=download.php?url=/files/aaaa.pdf>あ</a><br>' . '<a href="/files/cccc.html">い</a><br>' . '<a href=download.php?url=/files/dddd.doc>う</a><br>' . '<a href=download.php?url=/files/eeee.xls>え</a><br>' ;

    • ベストアンサー
    • PHP
  • phpについて

    urlの末尾(ファイル名)を取得し a href="末尾"に入れることはできますか? ファイル名がたとえば10.phpのときファイル名にインクリメント、デクリメントをしてa href="9" とa href="11"を作りたいです。 ファイル名が11.phpのときは a href="10" とa href="12"を作りたいです。 urlの取得ができるのか? 上記のプログラムの仕方を教えていただきたいです。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • HTMLのマークアップ方法

    WEB製作を勉強中のものですが、こうゆうソースを見つけたので教えていただけないでしょうか? <dl class="top_list"> <dd><a href="http://www---------">ぬくぬくマフラーを編もう</a></dd> </dl> <dl class="top_list"> <dd><a href="http://www---------">かぎ針・棒針体験</a></dd> </dl> <dl class="top_list"> <dd><a href="http://www---------">フェルトで季節のスウィーツ作り</a></dd> </dl> のように定義リストで<dt>タグがなくても成立するのですか? Dreamweaver cs3を使用しているのですがソースは手入力ですか?

  • PHPを使ったアクセス解析を実現したい

    PHPを使ったアクセス解析を実現したいと思ってます。 どの場所のリンクがクリックされたのかを解析するものなのですが、 パラメータをもたないリンクであれば、 <a href="a.php?link=http://foo.com/&param=1">foo</a> のようにして、 paramで場所がわかって、a.php でリンクアドレスにリダイレクションするんですが、 <a href="a.php?link=http://foo.com/b.php?a=1&b=2&param=1"></a> http://foo.com/b.php?a=1&b=2 というリンクの場合には、 b=2 は、a.php のパラメーターと認識されてしまいます。 リンクは、http://foo.com/b.php?a=1&b=2でパラメーターは、 http://foo.com/b.php?a=1&b=2 と param=1 とする方法はありませんでしょうか。 アドバイスのほど、よろしくお願いします。

    • ベストアンサー
    • PHP
  • PHPでHTMLファイルを解析して配列へ・・・

    phpを使用して、下記のhtmlファイルを外部から取得して、解析してMySQLに格納したいと考えています。 問題となったのは、全部の記述が一行で書かれているので、strstrで探してstr_replaceで書き換えて・・・ といった作業をどのようにしていいかわかりません。 結果的には、出現順に多次元配列に$hairetu[] = array(categ => 【カテゴリ】, url => 'http://xxxxxxx.xx' , title => 【タイトル】);という形で収めていきたいです。 以下、解析元ファイルの記述例ですが、このような形式で1000件以上はあります。 <font color="#000000">【カテゴリ】</font><br><a href="http://xxxxxxx.xx">【タイトル】</a><br>【リンク先説明・・・】<br><font color="#000000">【カテゴリ2】</font><br><a href="http://xxxxxxx2.xx">【タイトル2】</a><br>【リンク先説明・・・2】<br>...

    • ベストアンサー
    • PHP
  • テンプレート化したphpのmenu.php内で<a href="#">の戻り値が重複してしまう。

    PHPの勉強の為、簡易テンプレートを作成しているのですが、config.php内で指定したURLをmenu.phpで実行させたところ戻り値が重複して困っています。 ※wordpessなどで見かけるURLテンプレートタグによって、<a href="この部分">のhttp~のURLを書かなくてもいいようにしたいです。 【各ファイル】 ●index.php ●config.php [templatesフォルダ] footer.php header.php ●menu.php style.css [htmlフォルダ] ●index.php トップのindex.php内では、<?php require_once('config.php'); ?>にてconfig.phpを読み込んでいます。 メニューはパーツ分けしたので、<?php include "templates/menu.php"; ?>にて読み込んでいます。 config.phpでは、URLの戻り値として、 <?php define(SITE_URL, "http://www.yahoo.co.jp"); ?> を指定しています。 上記をtempleatesフォルダ内のmenu.phpで実行させました。 <ul> <li><a href="<?php echo SITE_URL; ?>">HOME</a></li> <li><a href="<?php echo SITE_URL; ?>/html/index.php">テスト</a></li> </ul> これで、絶対パスを書かなくてもURLが作れると思ったのですが、実際の戻り値が、 http://www.yahoo.co.jphttp://www.yahoo.co.jp と重複してしまい、ページ移動ができません。 これは、どうしてなのでしょうか? どなたか教えていただけないでしょうか。

    • ベストアンサー
    • PHP
  • HTMLタグ一括編集

    <a href="URL.***"><img src="URL.***"></a> 上記のタグの場合、***の部分だけをフォルダから一括で連番指定出来るソフトを探しています。 例えば <a href="URL.001.jpg"><img src="URL.001.jpg"></a> ・ ・ ・ <a href="URL.054.jpg"><img src="URL.054.jpg"></a> という風にタグに中に一括で001.jpg~054.jpgだけを入れ替えるソフトです。 よろしくお願いします。

  • データベースのページング出力を行うPHPのコード

    現在、phpとmySQLを勉強しています。 データベース名:animal、テーブル名:pet、フィールド名が順にID:title:url:scoreで 1:ねこ:neko.com:43 2:いぬ:空白:24 3:空白:空白:空白 4:とり:bird.com:62 : というデータがあります。 このとき、 1<a href="neko.com">ねこ</a>43<br> 2<a href=" ">いぬ</a>24<br> 3<a href=" "></a><br> 4<a href="bird.com">とり</a>62<br> : のように10行ずつhtmlに出力するPHPを書こうと思っています。 10行ずつですので、上の例だとURLの最後の書き換えによってpage=2、page=3、…とアクセスできます。 自分でもmysqlを呼び出し、要素を変数に格納して、foreachを使って最後まで順繰りに出力するように作成して、ページングするように作ってみたのですが、どうも正常に出力されません。 考えましたがどうにも原因が不明なので、どなたかこのような動作を示すPHPの模範コードを書いていただけないでしょうか。 PHPは未だ勉強中ですが、教えていただいたコードと自分のコードを比較して、より精進したいと思います。 どうかよろしくお願いします。

    • ベストアンサー
    • PHP
  • PHPについての質問です。

    _PHPで、 「もし、変数$testが『1』なら、"<li><a href="$test_url">テスト</a></li>"を表示させなさい。」 というのを記述したいのですが、 どうやればよいでしょうか、 <?php if ($test=1) { echo "<li><a href="print ($test_url)";\">テスト</a></li>" } ?> というのをやってみたのですが、エラーで終わりました。 どうすればよいでしょうか?よろしくお願いします。

    • ベストアンサー
    • PHP

専門家に質問してみよう