質問編集履歴

1

修正しました。

2018/09/25 02:43

投稿

yonaja
yonaja

スコア20

test CHANGED
File without changes
test CHANGED
@@ -14,14 +14,24 @@
14
14
 
15
15
  スクレイピングしたいページのURLは
16
16
 
17
- http://www.bookoffonline.co.jp/display/L001,q=%2582%25A0%2582%25CC%2589%25D4
17
+ [http://www.bookoffonline.co.jp/display/L001,q=%2582%25A0%2582%25CC%2589%25D4](http://www.bookoffonline.co.jp/display/L001,q=%2582%25A0%2582%25CC%2589%25D4)
18
18
 
19
19
 
20
20
 
21
21
  スクレイピングしたい要素のxpathは
22
22
 
23
+ ### xpath
24
+
25
+
26
+
27
+ ```
28
+
23
29
  //*[@id="resList"]/form/div[4]/div[3]/div[1]/div[2]/table/tbody/tr[2]/td
24
30
 
31
+ ```
32
+
33
+
34
+
25
35
  になります。
26
36
 
27
37
  ちなみに上記のxpathの要素の中身は以下のようになっています。
@@ -30,6 +40,12 @@
30
40
 
31
41
  _______________________________________________________
32
42
 
43
+ ### 要素の中身
44
+
45
+
46
+
47
+ ```
48
+
33
49
  <td class="mainprice">
34
50
 
35
51
  ¥128
@@ -54,13 +70,141 @@
54
70
 
55
71
  </td>
56
72
 
57
- _______________________________________________________
73
+ ```
58
74
 
59
75
 
60
76
 
61
77
  実行しているphpプログラムは以下の通りです。
62
78
 
79
+ ### 該当のソースコード
80
+
81
+
82
+
83
+ ```php
84
+
85
+ <?php
86
+
87
+
88
+
63
- __________________________________
89
+ /* HTML特殊文字をエスケープする関数 */
90
+
91
+ function h($str) {
92
+
93
+ return htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
94
+
95
+ }
96
+
97
+
98
+
99
+ if (1) {
100
+
101
+ // コンテンツを取得
102
+
103
+ $ch = curl_init();
104
+
105
+ curl_setopt_array($ch, [
106
+
107
+ CURLOPT_URL => 'http://www.bookoffonline.co.jp/display/L001,q=%2582%25A0%2582%25CC%2589%25D4',
108
+
109
+ CURLOPT_RETURNTRANSFER => true,
110
+
111
+ CURLOPT_FOLLOWLOCATION => true,
112
+
113
+ CURLOPT_AUTOREFERER => true,
114
+
115
+ CURLOPT_USERAGENT => 'Mozilla/5.0',
116
+
117
+ CURLOPT_ENCODING => 'gzip',
118
+
119
+ ]);
120
+
121
+ $html = curl_exec($ch);
122
+
123
+
124
+
125
+ // エラーを出さずにDOMDocumentに読み込む
126
+
127
+ $dom = new DOMDocument;
128
+
129
+ @$dom->loadHTML($html);
130
+
131
+
132
+
133
+ $xpath = new DOMXPath($dom);
134
+
135
+
136
+
137
+ $aa[0]=$xpath ->query('//*[@id="resList"]/form/div[4]/div[3]/div[1]/div[2]/table/tbody/tr[2]/td')->item(0)->nodeValue;
138
+
139
+
140
+
141
+ echo $aa[0];
142
+
143
+ }
144
+
145
+ ?>
146
+
147
+ ```
148
+
149
+
150
+
151
+
152
+
153
+
154
+
155
+ $xpath ->queryを実装中に以下のエラーメッセージが発生しました。
156
+
157
+
158
+
159
+ ### 発生している問題・エラーメッセージ
160
+
161
+
162
+
163
+ ```
164
+
165
+ Notice: Trying to get property 'nodeValue' of non-object in C:\xampp\htdocs\tatsuki\title.php on line 27
166
+
167
+ ```
168
+
169
+
170
+
171
+ ### 該当のソースコード
172
+
173
+
174
+
175
+ ```php
176
+
177
+ $aa[0]=$xpath ->query('//*[@id="resList"]/form/div[4]/div[3]/div[1]/div[2]/table/tbody/tr[2]/td')->item(0)->nodeValue;
178
+
179
+ ```
180
+
181
+
182
+
183
+ ### 試したこと
184
+
185
+ xpath->queryがいけないのかと思い、以下のページを参考にxpath->evaluateも使ってみましたが上手く行きませんでした。
186
+
187
+
188
+
189
+ [https://qiita.com/mpyw/items/c0312271819baee09132#domnodelist-%E3%82%AF%E3%83%A9%E3%82%B9](https://qiita.com/mpyw/items/c0312271819baee09132#domnodelist-%E3%82%AF%E3%83%A9%E3%82%B9)
190
+
191
+
192
+
193
+ [https://qiita.com/mpyw/items/0454c46b7c1cc06ef5c8](https://qiita.com/mpyw/items/0454c46b7c1cc06ef5c8)
194
+
195
+
196
+
197
+ 正直xpath->queryとxpath->evaluateの違いは理解しておりません。
198
+
199
+ ちなみにxpath->evaluateを使用したときは、xpath->queryのところを
200
+
201
+ 変更しました。プログラムは以下の通りです。
202
+
203
+ ### 該当のソースコード
204
+
205
+
206
+
207
+ ```php
64
208
 
65
209
  <?php
66
210
 
@@ -114,7 +258,13 @@
114
258
 
115
259
 
116
260
 
117
- $aa[0]=$xpath ->query('//*[@id="resList"]/form/div[4]/div[3]/div[1]/div[2]/table/tbody/tr[2]/td')->item(0)->nodeValue;
261
+ //$aa[0]=$xpath ->query('//*[@id="resList"]/form/div[4]/div[3]/div[1]/div[2]/table/tbody/tr[2]/td')->item(0)->nodeValue;
262
+
263
+
264
+
265
+ $b = $xpath->query('//*[@id="resList"]/form/div[4]/div[3]/div[1]/div[2]/table/tbody')->item(0);
266
+
267
+ $aa[0] = $xpath->evaluate('string(.//tr[2]/td)', $b);
118
268
 
119
269
 
120
270
 
@@ -124,63 +274,13 @@
124
274
 
125
275
  ?>
126
276
 
127
-
128
-
129
- $xpath ->queryを実装中に以下のエラーメッセージが発生しました。
130
-
131
-
132
-
133
- ### 発生している問題・エラーメッセージ
134
-
135
-
136
-
137
- ```
277
+ ```
138
-
139
- Notice: Trying to get property 'nodeValue' of non-object in C:\xampp\htdocs\tatsuki\title.php on line 27
278
+
140
-
141
- ```
279
+
142
-
143
-
144
-
145
- ### 該当のソースコード
280
+
146
-
147
-
148
-
149
- ```php
281
+
150
-
151
- $aa[0]=$xpath ->query('//*[@id="resList"]/form/div[4]/div[3]/div[1]/div[2]/table/tbody/tr[2]/td')->item(0)->nodeValue;
282
+
152
-
153
- ```
283
+
154
-
155
-
156
-
157
- ### 試したこと
158
-
159
- xpath->queryがいけないのかと思い、以下のページを参考にxpath->evaluateも使ってみましたが上手く行きませんでした。
160
-
161
-
162
-
163
- https://qiita.com/mpyw/items/c0312271819baee09132#domnodelist-%E3%82%AF%E3%83%A9%E3%82%B9
164
-
165
-
166
-
167
- https://qiita.com/mpyw/items/0454c46b7c1cc06ef5c8
168
-
169
-
170
-
171
- 正直xpath->queryとxpath->evaluateの違いは理解しておりません。
172
-
173
- ちなみにxpath->evaluateを使用したときは、xpath->queryのところを
174
-
175
-
176
-
177
- $b = $xpath->query('//*[@id="resList"]/form/div[4]/div[3]/div[1]/div[2]/table/tbody')->item(0);
178
-
179
- $aa[0] = $xpath->evaluate('string(.//tr[2]/td)', $b);
180
-
181
-
182
-
183
- に変更しました。
184
284
 
185
285
  エラーメッセージはありませんが、全く関係ない要素が取得されます。
186
286