質問編集履歴

1

作成中に誤って送信してしまったので補足しました。

2021/11/15 13:40

投稿

BigCulture
BigCulture

スコア2

test CHANGED
File without changes
test CHANGED
@@ -14,17 +14,25 @@
14
14
 
15
15
 
16
16
 
17
+ ### 情報の取得方法
18
+
19
+
20
+
21
+ URLの取得 → クラスの抽出 → `a`の抽出 → `href`の抽出 → URLを絶対表記に置換
22
+
23
+
24
+
17
25
  ### 処理の流れ
18
26
 
19
27
 
20
28
 
21
- 1. トップページから情報を抽出する
29
+ 1.トップページから情報を抽出する
22
30
 
23
31
  > https://www.sej.co.jp/products/
24
32
 
25
33
 
26
34
 
27
- 2. 商品カテゴリ別に情報を格納した後、関東地方にリンクを限定する
35
+ 2.商品カテゴリ別に情報を格納した後、関東地方にリンクを限定する
28
36
 
29
37
  > 'https://www.sej.co.jp/products/a/onigiri/kanto/',
30
38
 
@@ -34,19 +42,305 @@
34
42
 
35
43
 
36
44
 
37
- 3. 関東地方だけに設定した商品リンクから、情報を抽出する
38
-
39
-
40
-
41
- ### 情報取得方法
42
-
43
-
44
-
45
- URLの取得 → クラスの抽出 → `a`の抽出 → `href`の抽出 → URLを絶対表記に置換
46
-
47
-
48
-
49
- 情報の格納先 → `contents`
45
+ 3.関東地方だけに設定した商品リンクから、情報を抽出する
46
+
47
+
48
+
49
+ ### 該当ソースコード
50
+
51
+
52
+
53
+ ```Python
54
+
55
+ import re
56
+
57
+ import requests
58
+
59
+ import pandas as pd
60
+
61
+ from bs4 import BeautifulSoup
62
+
63
+ from time import sleep
64
+
65
+
66
+
67
+ # URLを取得する関数
68
+
69
+ def GetUrl(GetTheURL):
70
+
71
+ # 取得したいURL
72
+
73
+ url = GetTheURL
74
+
75
+
76
+
77
+ global r
78
+
79
+
80
+
81
+ # urlを引数に指定して、HTTPリクエストを送信してHTMLを取得、取得したデータを変数 r に格納
82
+
83
+ r = requests.get(url)
84
+
85
+
86
+
87
+ # 格納したデータの文字コードを自動でエンコーディング
88
+
89
+ r.encoding = r.apparent_encoding
90
+
91
+
92
+
93
+ sleep(2)
94
+
95
+
96
+
97
+
98
+
99
+ # 取得したいURLからクラスを抽出する関数
100
+
101
+ def GetSoupClass(GetClass, value):
102
+
103
+
104
+
105
+ soup = BeautifulSoup(r.text, 'html.parser')
106
+
107
+
108
+
109
+ global contents
110
+
111
+ content = []
112
+
113
+
114
+
115
+ # find or find_allを設定するための値
116
+
117
+ value == 0
118
+
119
+
120
+
121
+ if value == 0:
122
+
123
+ contents = soup.find(class_= GetClass)
124
+
125
+ elif value == 1:
126
+
127
+ contents = soup.find_all(class_= GetClass)
128
+
129
+ else:
130
+
131
+ # ここをindex[3,5,7,9]番目だけ抽出したい
132
+
133
+ contents = soup.find_all(class_= GetClass)[3]
134
+
135
+ content.append(contents)
136
+
137
+ contents = content
138
+
139
+
140
+
141
+ # soupで入手した値から a を抽出する関数
142
+
143
+ def Find_a(FindContents):
144
+
145
+
146
+
147
+ global ProductList
148
+
149
+ ProductList = []
150
+
151
+
152
+
153
+ for i in range(len(FindContents)):
154
+
155
+ content = FindContents[i].find('a')
156
+
157
+ ProductList.append(content)
158
+
159
+
160
+
161
+
162
+
163
+ # soupで取得した値から href を抽出する関数
164
+
165
+ def GetHref(hrefValue):
166
+
167
+
168
+
169
+ global ProductLink
170
+
171
+ ProductLink = []
172
+
173
+
174
+
175
+ for i in range(len(hrefValue)):
176
+
177
+ link_ = hrefValue[i].get('href')
178
+
179
+ ProductLink.append(link_)
180
+
181
+
182
+
183
+
184
+
185
+ # URLを相対表記から絶対表記に置換する関数
186
+
187
+ def ReplaceURL(Before, After):
188
+
189
+
190
+
191
+ global ProductLink
192
+
193
+
194
+
195
+ ProductLink = [item.replace(Before, After) for item in ProductLink]
196
+
197
+
198
+
199
+ GetUrl("https://www.sej.co.jp/products/")
200
+
201
+ GetSoupClass("sideCategoryNav", 0)
202
+
203
+
204
+
205
+ # HTMLから商品情報が格納されている a タグを全て表示
206
+
207
+ get_a = contents.find_all('a')
208
+
209
+ GetHref(get_a)
210
+
211
+ ReplaceURL("/products", "https://www.sej.co.jp/products")
212
+
213
+
214
+
215
+ # 関東地方のみに商品カテゴリを絞り込む
216
+
217
+ ProductLinkKanto = []
218
+
219
+
220
+
221
+ for i in range(len(ProductLink)):
222
+
223
+ text = ProductLink[i]
224
+
225
+ # URLの末尾にkanto/を追加
226
+
227
+ Newtext = re.sub('$',"kanto/",text)
228
+
229
+ ProductLinkKanto.append(Newtext)
230
+
231
+
232
+
233
+ # 今週の新商品と来週の新商品は内容が重複するため削除する
234
+
235
+ ProductLink = ProductLinkKanto[2:18]
236
+
237
+
238
+
239
+ # 取得したリンク先に、カテゴリ別の表記を格納する
240
+
241
+ # カテゴリ別の表記がない場合は、リンクをそのまま格納する
242
+
243
+
244
+
245
+ ProductList = []
246
+
247
+
248
+
249
+ for i in range(len(ProductLink)):
250
+
251
+
252
+
253
+ GetUrl(ProductLink[i])
254
+
255
+
256
+
257
+ if i < 2:
258
+
259
+ GetSoupClass("list_btn brn pbNested pbNestedWrapper", 1)
260
+
261
+ elif i < 3:
262
+
263
+ GetSoupClass("list_btn pbNested pbNestedWrapper", 1)
264
+
265
+ elif i == 4 or i == 6 or i >= 10 and i <= 13:
266
+
267
+ GetSoupClass("pbBlock pbBlockBase", 2)
268
+
269
+ else:
270
+
271
+ contents = ProductLink[i]
272
+
273
+
274
+
275
+ ProductList.append(contents)
276
+
277
+
278
+
279
+ ```
280
+
281
+
282
+
283
+ ### 試したこと
284
+
285
+
286
+
287
+ `GetSoupClass`の
288
+
289
+ ```GetSoupClass
290
+
291
+ if value == 0:
292
+
293
+ contents = soup.find(class_= GetClass)
294
+
295
+ elif value == 1:
296
+
297
+ contents = soup.find_all(class_= GetClass)
298
+
299
+ else:
300
+
301
+ # 3,5,7,9番目だけ抽出する
302
+
303
+ contents = soup.find_all(class_= GetClass)[3]
304
+
305
+ content.append(contents)
306
+
307
+ contents = content
308
+
309
+
310
+
311
+ ```
312
+
313
+
314
+
315
+ の部分について、奇数番号のみを取得したかったので
316
+
317
+
318
+
319
+ ```
320
+
321
+ for i in range(10):
322
+
323
+ if value == 2 and i % 2 == 1:
324
+
325
+ contents = soup.find_all(class_= GetClass)[i]
326
+
327
+ content.append(contents)
328
+
329
+ elif value == 1:
330
+
331
+ contents = soup.find_all(class_= GetClass)
332
+
333
+ else:
334
+
335
+ contents = soup.find(class_= GetClass)
336
+
337
+ contents = content
338
+
339
+ ```
340
+
341
+
342
+
343
+ と変更して試してみました。
50
344
 
51
345
 
52
346
 
@@ -56,251 +350,49 @@
56
350
 
57
351
  ```
58
352
 
59
-
60
-
61
- ```
62
-
63
-
64
-
65
- ### 該当のソースコード
66
-
67
-
68
-
69
- ```Python
70
-
71
- import re
72
-
73
- import requests
74
-
75
- import pandas as pd
76
-
77
- from bs4 import BeautifulSoup
78
-
79
- from time import sleep
80
-
81
-
82
-
83
- # URLを取得する関数
84
-
85
- def GetUrl(GetTheURL):
86
-
87
- # 取得したいURL
88
-
89
- url = GetTheURL
90
-
91
-
92
-
93
- global r
94
-
95
-
96
-
97
- # urlを引数に指定して、HTTPリクエストを送信してHTMLを取得、取得したデータを変数 r に格納
98
-
99
- r = requests.get(url)
100
-
101
-
102
-
103
- # 格納したデータの文字コードを自動でエンコーディング
104
-
105
- r.encoding = r.apparent_encoding
106
-
107
-
108
-
109
- sleep(2)
110
-
111
-
112
-
113
-
114
-
115
- # 取得したいURLからクラスを抽出する関数
116
-
117
- def GetSoupClass(GetClass, value):
118
-
119
-
120
-
121
- soup = BeautifulSoup(r.text, 'html.parser')
122
-
123
-
124
-
125
- global contents
126
-
127
- content = []
128
-
129
-
130
-
131
- # find or find_allを設定するための値
132
-
133
- value == 0
134
-
135
-
136
-
137
- if value == 0:
138
-
139
- contents = soup.find(class_= GetClass)
140
-
141
- elif value == 1:
142
-
143
- contents = soup.find_all(class_= GetClass)
144
-
145
- else:
146
-
147
- # ここをindex[3,5,7,9]番目だけ抽出したい
148
-
149
- contents = soup.find_all(class_= GetClass)[3]
150
-
151
- content.append(contents)
152
-
153
- contents = content
154
-
155
-
156
-
157
-
158
-
159
- # soupで取得した値から href を抽出する関数
160
-
161
- def GetHref(hrefValue):
162
-
163
-
164
-
165
- global ProductLink
166
-
167
- ProductLink = []
168
-
169
-
170
-
171
- for i in range(len(hrefValue)):
172
-
173
- link_ = hrefValue[i].get('href')
174
-
175
- ProductLink.append(link_)
176
-
177
-
178
-
179
-
180
-
181
- # soupで入手した値から a を抽出する関数
182
-
183
- def Find_a(FindContents):
184
-
185
-
186
-
187
- global ProductList
188
-
189
- ProductList = []
190
-
191
-
192
-
193
- for i in range(len(FindContents)):
194
-
195
- content = FindContents[i].find('a')
196
-
197
- ProductList.append(content)
198
-
199
-
200
-
201
- # URLを相対表記から絶対表記に置換する関数
202
-
203
- def ReplaceURL(Before, After):
204
-
205
-
206
-
207
- global ProductLink
208
-
209
-
210
-
211
- ProductLink = [item.replace(Before, After) for item in ProductLink]
212
-
213
-
214
-
215
- GetUrl("https://www.sej.co.jp/products/")
216
-
217
- GetSoupClass("sideCategoryNav", 0)
218
-
219
-
220
-
221
- # HTMLから商品情報が格納されている a タグを全て表示
222
-
223
- get_a = contents.find_all('a')
224
-
225
- GetHref(get_a)
226
-
227
- ReplaceURL("/products", "https://www.sej.co.jp/products")
228
-
229
-
230
-
231
- # 関東地方のみに商品カテゴリを絞り込む
232
-
233
- ProductLinkKanto = []
234
-
235
-
236
-
237
- for i in range(len(ProductLink)):
238
-
239
- text = ProductLink[i]
240
-
241
- # URLの末尾にkanto/を追加
242
-
243
- Newtext = re.sub('$',"kanto/",text)
244
-
245
- ProductLinkKanto.append(Newtext)
246
-
247
-
248
-
249
- # 今週の新商品と来週の新商品は内容が重複するため削除する
250
-
251
- ProductLink = ProductLinkKanto[2:18]
252
-
253
-
254
-
255
- # 取得したリンク先に、カテゴリ別の表記を格納する
256
-
257
- # カテゴリ別の表記がない場合は、リンクをそのまま格納する
258
-
259
-
260
-
261
- ProductList = []
262
-
263
-
264
-
265
- for i in range(len(ProductLink)):
266
-
267
-
268
-
269
- GetUrl(ProductLink[i])
270
-
271
-
272
-
273
- if i < 2:
274
-
275
- GetSoupClass("list_btn brn pbNested pbNestedWrapper", 1)
276
-
277
- elif i < 3:
278
-
279
- GetSoupClass("list_btn pbNested pbNestedWrapper", 1)
280
-
281
- elif i == 4 or i == 6 or i >= 10 and i <= 13:
282
-
283
- GetSoupClass("pbBlock pbBlockBase", 2)
284
-
285
- else:
286
-
287
- contents = ProductLink[i]
288
-
289
-
290
-
291
- ProductList.append(contents)
292
-
293
-
294
-
295
- ```
296
-
297
-
298
-
299
- ### 試したこと
300
-
301
-
302
-
303
- ここに問題に対して試したことを記載してください。
353
+ ```
354
+
355
+ ---------------------------------------------------------------------------
356
+
357
+ IndexError Traceback (most recent call last)
358
+
359
+ <ipython-input-36-eb08a21b7137> in <module>
360
+
361
+ 13 GetSoupClass("list_btn pbNested pbNestedWrapper", 1)
362
+
363
+ 14 elif i == 4 or i == 6 or i >= 10 and i <= 13:
364
+
365
+ ---> 15 GetSoupClass("pbBlock pbBlockBase", 2)
366
+
367
+ 16 else:
368
+
369
+ 17 contents = ProductLink[i]
370
+
371
+
372
+
373
+ <ipython-input-35-c1265b5f2c6f> in GetSoupClass(GetClass, value)
374
+
375
+ 13 for i in range(10):
376
+
377
+ 14 if value == 2 and i % 2 == 1:
378
+
379
+ ---> 15 contents = soup.find_all(class_= GetClass)[i]
380
+
381
+ 16 content.append(contents)
382
+
383
+ 17 elif value == 1:
384
+
385
+
386
+
387
+ IndexError: list index out of range
388
+
389
+ ```
390
+
391
+
392
+
393
+ となってしまいました。これらの解決策についてご教授いただけると幸いです。
394
+
395
+
304
396
 
305
397
 
306
398
 
@@ -308,4 +400,12 @@
308
400
 
309
401
 
310
402
 
403
+ python 3.8.8
404
+
405
+
406
+
407
+ ### 最後に
408
+
409
+
410
+
311
- ここにより詳細な情報を記載ださい。
411
+ プログラミング初心者のため拙いコードでの質問なりますが何卒しくお願致します