phpQueryを使って、スクレイピングをしようとしています。
text()で値をとることはできたのですが、
html()でタグをとることができません。
何故でしょうか。初心者の質問でお手数をおかけします。
php
1require_once('./phpQuery-onefile.php'); 2 3//urlはPOSTで取得できています。 4$fgc = file_get_contents('https://qiita.com/zaburo/items/465ca691aebad2b5691e'); 5$dom = phpQuery::newDocument($fgc); 6$title = $dom['title']->text(); //←こちらは値が取れて 7$kiji = $dom['.it-MdContent']->html(); //←こちらはエラーとなります 8 9$rs = array( 10 'title' => $title, 11 'kiji' => $kiji 12); 13//json を出力 14 header("Content-Type:application/json; charset=utf-8"); 15 echo json_encode($rs);
▼html()のエラーの内容
SyntaxError: JSON Parse error: Unrecognized token '<'
//▼追記しました。
html
1<table> 2 <tr> 3 <td>TITLE</td><td class="title"></td> 4 </tr> 5 <tr> 6 <td>kiji</td><td class="kiji"></td> 7 </tr> 8</table> 9<script> 10$(function(){ 11 function getAllData(postData){ 12 $.ajax({ 13 type : 'post', 14 url : 'request.php', 15 data : postData, 16 dataType : 'json', 17 success : function(data){ 18 19 $('.title').text(data.title); 20 $('.kiji').html(data.kiji); 21 22 }, 23 error : function(XMLHttpRequest,textStatus,errorThrown){ 24 console.log('読み込み失敗'+ errorThrown); 25 } 26 }); 27 } 28}); 29</script>
実際取得しようとしているhtmlを提示されたほうが良いかもしれません。コードではなくデータが正しくないこともあります。
JSON Parse error なのでデータ構造が正しくなければ容赦なくエラーになります。
#kijiからit-MdContentにかわっていますが、これは?
元の#kijiであれば.kijiにかえれば行く可能性はありますが(でもクラス指定なので実際は配列かもしれないのでループさせたほうがいいかもしれませんが)
先ほどは仮で入力していたものでしたので、、すみません。
html内にit-MdContentというclassが指定されているDOMがありませんが、このit-MdContentは何でしょうか?$dom['.it-MdContent']の結果をvar_dump()して内容確認されたほうがいいかもしれません。おそらくnullではないかと。
ありがとうございます。どこに書いたらいいかわからないので、調べます。
えーと・・・私が確認していることと質問者さんの返答がかみ合っていないような・・・。
.it-MdContentというclassは「以前は、PHP Simple HTML DOM Parserってのを使っていましたが、」の近くのsectionにあるので指定しているつもりでした。 まだvar_dumpの使い方わかってないので調べてます。。
qiitaの記事を読み込むURLに指定しながらどこから引っ張ってきたかわからないHTMLがコード追加されたので、どのように解釈していいのか困っています。var_dump()については「PHP デバッグ」で検索されたほうが良いですね。確認してもらいたいのは「変数が想定通りの情報を持っているか」なので。
説明が不足しており、申し訳ありません。。htmlファイルの方でphpにURLをPOSTして(今は強制的にqiitaをセットしています)、取れたデータをhtmlファイルのtableに吐き出すという事をしたいです。
var_dump($dom['.it-MdContent']);という記述をecho json_encode($rs);の前の行に追記したら、「SyntaxError: JSON Parse error: Unexpected identifier "object"」というエラーメッセージになりました。
なるほど。AjaxでPHPを実行しているということですね。そのあたりの解説を提示HTMLの前あたりに入れておいていただけますか?このコメント欄はデフォルト非表示で質問だけ見た人にはどのような関連があるか伝わりませんので。
またこれまで試していただいた感じだとあくまで「Ajaxで実行した結果のレスポンスのエラー」ですよね。そのあたりも書いておいていただければと思います。json_encode()でJSON文字列を返そうとしているが正しくJSONに変換できていないからだと思います。PHPだけで正しく実行できているか確認されたほうが良いかもしれませんね。特に何かPHPへPOSTしているわけでもなさそうですし。
ちょっと確認してみたんですが、実際のURLはQiitaの記事なんですか?もしQiitaの記事であればSSL環境下でないと情報は得られないように思います。やはり、実際のURLか、その取得するページのhtml(のミニマム版)を提示されたほうが良いかと思います。聞きたいことは「html()の使い方」であればまた別ですが・・。
ちなみに適当なhtmlを作って存在するclassを指定したうえでhtml()を実行した場合、意図通りのデータを取得できました。存在しないclass名やID名を指定されているのではないでしょうか。
ありがとうございます。PHPだけで正しく実行できているかどうか確認するため、echo json_encode($rs);をコメントアウトし、echo $kijiと記述しました。qiitaの記事を取得できました。実際のURLは都合上公開できないのですが、当方PCで実際のURLを試した所、文字化けを起こしていました。
どのような表示になっているかわかりませんが、JSONが取得できているのであれば文字化けではなくエンコードがかかった状態かと思います。PHPであればjson_decode()をかけると良いですよ。
回答1件
あなたの回答
tips
プレビュー