前提・実現したいこと
phpでブックオフオンラインのwebスクレイピングをしようとしています。
DOMXPathを利用しスクレイピングしようとしているのですが、特定の要素に限り取得が上手くできません。
自分なりの多くの方々のブログなどを参考にしてプログラムを作ってブックオフオンライン以外のサイトではうまくいくサイトもありました。
プログラミング初心者のため自分で調べて色々試したのですが解決できなかったので、どなたか教えていただけませんでしょうか。
専門用語すら、あやふやなため質問内容が伝わっているか不安です。
スクレイピングしたいページのURLは
http://www.bookoffonline.co.jp/display/L001,q=%2582%25A0%2582%25CC%2589%25D4
スクレイピングしたい要素のxpathは
xpath
//*[@id="resList"]/form/div[4]/div[3]/div[1]/div[2]/table/tbody/tr[2]/td
になります。
ちなみに上記のxpathの要素の中身は以下のようになっています。
この中の¥128を取得したいです。
要素の中身
<td class="mainprice"> ¥128 <span class="price_tax"> (税込) </span> <span> 定価より ¥386 おトク! </span> <th class="tab01"> 中古価格 </th> </td>
実行しているphpプログラムは以下の通りです。
該当のソースコード
php
1 <?php 2 3 /* HTML特殊文字をエスケープする関数 */ 4function h($str) { 5 return htmlspecialchars($str, ENT_QUOTES, 'UTF-8'); 6} 7 8if (1) { 9 // コンテンツを取得 10 $ch = curl_init(); 11 curl_setopt_array($ch, [ 12 CURLOPT_URL => 'http://www.bookoffonline.co.jp/display/L001,q=%2582%25A0%2582%25CC%2589%25D4', 13 CURLOPT_RETURNTRANSFER => true, 14 CURLOPT_FOLLOWLOCATION => true, 15 CURLOPT_AUTOREFERER => true, 16 CURLOPT_USERAGENT => 'Mozilla/5.0', 17 CURLOPT_ENCODING => 'gzip', 18 ]); 19 $html = curl_exec($ch); 20 21 // エラーを出さずにDOMDocumentに読み込む 22 $dom = new DOMDocument; 23 @$dom->loadHTML($html); 24 25 $xpath = new DOMXPath($dom); 26 27 $aa[0]=$xpath ->query('//*[@id="resList"]/form/div[4]/div[3]/div[1]/div[2]/table/tbody/tr[2]/td')->item(0)->nodeValue; 28 29 echo $aa[0]; 30} 31?>
$xpath ->queryを実装中に以下のエラーメッセージが発生しました。
発生している問題・エラーメッセージ
Notice: Trying to get property 'nodeValue' of non-object in C:\xampp\htdocs\tatsuki\title.php on line 27
該当のソースコード
php
1 $aa[0]=$xpath ->query('//*[@id="resList"]/form/div[4]/div[3]/div[1]/div[2]/table/tbody/tr[2]/td')->item(0)->nodeValue;
試したこと
xpath->queryがいけないのかと思い、以下のページを参考にxpath->evaluateも使ってみましたが上手く行きませんでした。
https://qiita.com/mpyw/items/c0312271819baee09132#domnodelist-%E3%82%AF%E3%83%A9%E3%82%B9
https://qiita.com/mpyw/items/0454c46b7c1cc06ef5c8
正直xpath->queryとxpath->evaluateの違いは理解しておりません。
ちなみにxpath->evaluateを使用したときは、xpath->queryのところを
変更しました。プログラムは以下の通りです。
該当のソースコード
php
1<?php 2 3 /* HTML特殊文字をエスケープする関数 */ 4function h($str) { 5 return htmlspecialchars($str, ENT_QUOTES, 'UTF-8'); 6} 7 8if (1) { 9 // コンテンツを取得 10 $ch = curl_init(); 11 curl_setopt_array($ch, [ 12 CURLOPT_URL => 'http://www.bookoffonline.co.jp/display/L001,q=%2582%25A0%2582%25CC%2589%25D4', 13 CURLOPT_RETURNTRANSFER => true, 14 CURLOPT_FOLLOWLOCATION => true, 15 CURLOPT_AUTOREFERER => true, 16 CURLOPT_USERAGENT => 'Mozilla/5.0', 17 CURLOPT_ENCODING => 'gzip', 18 ]); 19 $html = curl_exec($ch); 20 21 // エラーを出さずにDOMDocumentに読み込む 22 $dom = new DOMDocument; 23 @$dom->loadHTML($html); 24 25 $xpath = new DOMXPath($dom); 26 27 //$aa[0]=$xpath ->query('//*[@id="resList"]/form/div[4]/div[3]/div[1]/div[2]/table/tbody/tr[2]/td')->item(0)->nodeValue; 28 29 $b = $xpath->query('//*[@id="resList"]/form/div[4]/div[3]/div[1]/div[2]/table/tbody')->item(0); 30 $aa[0] = $xpath->evaluate('string(.//tr[2]/td)', $b); 31 32 echo $aa[0]; 33} 34?>
エラーメッセージはありませんが、全く関係ない要素が取得されます。
知識がなさすぎるためとんちんかんではありますが、どなたか教えてください。
宜しくお願いします。
回答2件
あなたの回答
tips
プレビュー