• ベストアンサー

HTML DOM Parserで取得できない

PHP Simple HTML DOM Parserでスクレイピングをしているのですが、 $row = <<<EOF <a href="http://yahoo.co.jp">yahoo</a> EOF; $row = str_get_html($row); echo $row; // 表示される echo $row->href; // 表示されない 上記の表示されない部分はどうやったらできますでしょうか? よろしくお願いします。

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

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

  • ベストアンサー
noname#244856
noname#244856
回答No.1

echo $row->find('a')->href; だとどうなりますか? 【備考】 Simple HTML DOM Parser は内部でかなり効率の悪いことを行っているのであまりお勧めできません… http://qiita.com/mpyw/items/c0312271819baee09132 ライブラリに頼らずにやるんだったら $html = '<a href="http://yahoo.co.jp">yahoo</a>'; $dom = new DOMDocument; @$dom->loadHTML($html); $xpath = new DOMXPath($dom); echo $xpath->evaluate('string(//a/@href)'); でいけますね。

doshiroto33
質問者

お礼

回答ありがとうございます。 $row->find('a',0)->href で反映されました。 他ライブラリ等については、時間のある時に検討してみたいと思います。 ありがとうございました。

関連するQ&A

  • str_get_htmlがこける原因を知りたい

    よろしくお願いします。 PHP であるサイトをスクレイピングしているのですが、str_get_htmlが特定?のページだけ処理が失敗します。 例えば、1ページ~10ページ目までをスクレイピングしているときに、8ページ目だけ失敗します。 str_get_htmlの処理に失敗する原因って何々あるんでしょうか? 以下は、サーバ・PHPの情報になります。 ・サーバ:さくらのレンタルサーバ スタンダード ・PHP -v 5.4.22 ・ソース $HTML = file_get_contents($url); $encode_HTML = mb_convert_encoding($HTML, 'UTF-8', 'CP932'); $Dom = str_get_html($encode_HTML); // ここで$Domに値がはいっていないのを確認しました。 // print_r($encode_HTML); はHTMLソースにはなってました。 if ($Dom){ echo "OK"; }else{ echo "NG"; continue; }

    • ベストアンサー
    • PHP
  • PHPスクレイピングが上手くいきません

    PHP Simple HTML DOM Parser を使って、スクレイピングをやってみようと 試行錯誤している最中なのですが、上手く出来なくて困っています。 具体的に分からないのは、以下の点です。 -------------------------------------------------------------------- $html = file_get_html('http://...'); foreach($html->find('ここの指定方法が分かりません') as $item); echo $item->plaintext; -------------------------------------------------------------------- こういった場合の文字列の指定方法は、 何をどう勉強すれば理解出来るようになるのでしょうか。 具体的に教えて頂けると助かります。 また、http://www.iimy.co.jp/item/p-33969.htmlに記載されている、 「1口以上の価格」の数値をこの方法で表示させたい場合(単位の"円"を除く)、 どのような指定方法になりますか? 「class="infoBoxContents"」を含めれば指定しやすそうだと考えて、 foreach($html->find('.infoBoxContents') as $item); echo $item->plaintext; と記述して、ひとまずこのclassを全て表示させようとしたのですが、 表示されたのは「ポイント 0 ポイント」だけでした。 参考にしたのは以下サイトです。 [PHP Simple HTML DOM Parserの使用方法] http://www.crystal-creation.com/web-appli/technical-information/programming/php/library/simplehtmldom/manual.htm

    • ベストアンサー
    • PHP
  • simple_html_dom.phpのエラー

    時間があまりなかったので、 詳しく調べられてませんが、 simple_html_dom.php を使ってスクレイピングをしたのですが、 バッチが途中でkilledとなってしまいました。 エラーハンドリングにカスタマイズが必要だと思ってるのですが、 ご教授願えないでしょうか。 for($i=1; $i<100; $i++){ $param = ''; $url = sprintf('http://www.test.com?testid=%s, $i); echo "$url\n"; $html = file_get_html($url, false); } 上記で途中までは実行されるのですが、 途中でバッチがkilledとなり、 処理が終わってしまうのです。 ローカル環境ではうまく言ったのですが、 さくらのレンタルサーバでやるとそうなりました。 宜しくお願いします。

    • 締切済み
    • PHP
  • PHPの記述について

    質問させていただきます。 PHP Simple HTML DOM Parserを用いて 以下のような記述で ブラウザにより結果は表示されます。 この結果を テキストファイル(たとえばtest.txt)にして同じでディレクトリに 保存するにはどのような記述になりますか? よろしくお願いいたします。 <?php require_once('simple_html_dom.php'); $html = file_get_html('http ://hogehoge'); foreach($html->find('li[class=hogehogehoge]') as $element) echo $element->plaintext."<br />" ?>

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

    phpで質問です。 データベースから引っ張ってきたデータを while文の中にechoでa href="article?tag=row[3]"を表示させたいのですがどうすればいいですか? while( $row = $res->fetchArray() ) { echo '<a class="link_button" href="articletable?tag='.$row[3].'" method="get"">'.$row[3].'<span>'.'</a>'.''<a class="link_button" href="articletable?tag='.$row[4].'" method="get"">'.$row[4].'<span>'.'</a>' } また、if文でrow3もしくはrow4がnull(何も書いていない)の時, 強制的に「a href="article?tag=more」にさせたいのですがどうすればいいですか?

    • ベストアンサー
    • PHP
  • ParserにおけるSubjectの取得

    現在、特定のアドレスに送られてきたメールを別のメールアドレスに送信する、といったCGIを作成しています。 メールを標準入力で取得し、Parserを用いて解析を行っているのですが、どうしてもSubjectの取得がうまくいきません。 下記のように入力しています。 my $parser = new MIME::Parser; $parser->output_to_core(1); my $entity = $parser->parse(\*STDIN); $subject = $entity->head->get('Subject'); これを別のメールに送って確認してみると、subject = \x83e\x83L\x83X\x83g\x83\x81\x81[\x83\x8Bといった表示になります。 $subject = decode_mimewords($entity->head->get('Subject')); といった形も試してみたのですが、結果は同様でした。 Fromのほうは別の処理を用いて正常に表示できたのですが、そちらの処理をSubjectに適用しても結果は上記のようなものでした。 しばらく解決策を検索してみたりしたのですが、解決には至りませんでした。助言のほう、よろしくお願いいたします。

    • ベストアンサー
    • CGI
  • HTML::Parserの挙動がよく分かりません

    CGIプログラミング第2版を読みながらCGIを学習しています。 11章 "ステートの保持"の11.1 クエリ文字列とパス情報の例題ではまっております。。。 これはURLに識別子を埋め込んでユーザーを追跡するという、超ハイテクなスクリプトです。 とりあえず、記載されているとおりにスクリプトを作成してHTMLファイルも用意しました。 HTMLファイルの内容は超簡単で <HTML><HEAD><TITLE>store</TITLE></HEAD><BODY><A href="abc.html">abc</A></BODY></HTML> です。 これでユーザーがhttp://ウェブサーバー/store/下のファイルをリクエストすると、自動的にスクリプトが実行され、カスタマイズされたHTMLファイルが返されるという仕様です。 実際に返されたHTMLファイルを見てみると <HTML><HEAD><TITLE>store</title></head><BODY> なんと<A>タグ以降がばっさり切り落とされていました^^ しかもタグは全部大文字で書いたのに一部小文字になっていたりと、意味不明な状況です。 たぶんHTML::Parserなるものが、いろいろHTMLファイルを操作しているとは思うのですが、今回返されたHTMLはどう見ても壊れているような・・・。

    • ベストアンサー
    • Perl
  • 実行されない原因は?DOM?何かがインストールされていない??

    以下のソースが、自作のサーバでウマく動作しません。 フォームに文字を入力後、ボタンを押すと、 その直下に結果のURLが数行、表示されるものなのですが、 自作サーバで試したところ、一向に表示されません。 レンタルサーバでは正常に動いたのですが(文字化けはしますが) 非常に困っています… サーバはLinuxのRedHatEnterprise ES4で、PHP4です。 一応色々調べてみて、DOMはlixml2がインストールされていれば 動くみたいなことを知って、インストールしたのですが、 ダメでした。 原因は拡張モジュールの足らなさだけではないのでしょうか? (PHP5でもダメでした) どなたかわかるかた、教えてください!お願いします!! ↓Shift-JIS_________________________________________________________________ <!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="ブログ検索"></form> <hr> <?php mb_internal_encoding("shift-jis"); $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>

    • ベストアンサー
    • PHP
  • 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
  • dom要素のhtml取得について-get()

    dom要素のhtml取得について-get()メソッドを使用するのがいいのか? don要素のhtmlを取得したいと考えていますが うまくいきません。 以下htmlです。 ------------------------------------------------- <div id="hoge"> <div class="day-number">16</div> <div class="kurasuhoge"><a href="http://hogeURL.com" class="anker">○</a></div> <div class="day-number">17</div> <div class="kurasuhoge"><a href="http://hogeURL2.com" class="anker">○</a></div> </div> ------------------------------------------------- この中のアンカータグを取得し配列に格納したいです。以下のように格納出来れば理想です。 var hairetsu = {16:'<a href="http://hogeURL.com" class="anker">○</a>',17:'<a href="http://hogeURL2.com" class="anker">○</a>']; まずはアンカータグを取得と思い以下を書きました。 ------------------------------------------------- var hensu = $("#hoge .anker").parent().get(); alert(hensu); ------------------------------------------------- 結果[object HTMLDivElement],[object HTMLDivElement] と表示されてしまいます。 今getメソッドを使用していますが 他にいいメソッドがあればアドバイスいただけたら嬉しいです。 まとめますと 「#hogeの中の.anker要素をもつhtmlソースを摘出し配列に格納したいです。」 修正方法をご教示いただければ幸いです。

専門家に質問してみよう