teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

追記・修正

2020/03/26 10:22

投稿

CHERRY
CHERRY

スコア25234

answer CHANGED
@@ -36,4 +36,59 @@
36
36
  except ValueError:
37
37
  # ④-④.失敗した場合はエラー表示
38
38
  print("ValueError!")
39
+ ```
40
+
41
+ ----
42
+
43
+ また、今回の質問のプログラムでは、下記のようにインデントを修正して、1つ目の for ループ内に後半部分を入れるだけでも同じ機能になると思われます。(目指していたのはこちらでしょうか?)
44
+
45
+ ```
46
+ #●画像ファイルをダウンロードするための準備
47
+ # ①-①.ライブラリをインポート
48
+ import time
49
+ import re
50
+ import requests
51
+ from pathlib import Path
52
+ from bs4 import BeautifulSoup
53
+ # ①-②.出力フォルダを作成
54
+ output_folder = Path('C:\python\img')
55
+ output_folder.mkdir(exist_ok=True)
56
+ # ①-③.スクレイピングしたいURLを設定
57
+ url = 'https://www.hotpepper.jp/strJ001218137/food/'
58
+
59
+ # ①-④.画像ページのURLを格納するリストを用意
60
+ linklist = []
61
+
62
+ #●検索結果ページから画像のリンクを取り出す
63
+ # ②-①.検索結果ページのhtmlを取得
64
+ html = requests.get(url).text
65
+ # ②-②.検索結果ページのオブジェクトを作成
66
+ soup = BeautifulSoup(html, 'lxml')
67
+ # ②-③.画像リンクのタグをすべて取得
68
+ a_list =soup.select('div.columnPlex > p > a')
69
+ # ②-④.画像リンクを1つずつ取り出す
70
+ for a in a_list:
71
+ # ②-⑤.画像ページのURLを抽出
72
+ link_url = a.attrs['href']
73
+ # ②-⑥.画像ページのURLをリストに追加
74
+ linklist.append(link_url)
75
+ time.sleep(1.0)
76
+
77
+ # ③-⑦.画像ファイルの名前を抽出
78
+ filename = re.search(".*/(.*png|.*jpg)$",link_url)
79
+ # ③-⑧.保存先のファイルパスを生成
80
+ save_path = output_folder.joinpath(filename.group(1))
81
+ time.sleep(1.0)
82
+ # ●画像ファイルのURLからデータをダウンロード
83
+ try:
84
+ # ④-①.画像ファイルのURLからデータを取得
85
+ image = requests.get(link_url)
86
+ # ④-②.保存先のファイルパスにデータを保存
87
+ open(save_path, 'wb').write(image.content)
88
+ # ④-③.保存したファイル名を表示
89
+ print(save_path)
90
+ time.sleep(1.0)
91
+ except ValueError:
92
+ # ④-④.失敗した場合はエラー表示
93
+ print("ValueError!")
39
94
  ```

2

追記・修正

2020/03/26 10:22

投稿

CHERRY
CHERRY

スコア25234

answer CHANGED
@@ -8,4 +8,32 @@
8
8
 
9
9
  もしかして、画像を取得する部分もループの中で実行しているつもりで書かれたコードでしょうか?
10
10
 
11
- Python は、インデントが重要ですが、インデントについて理解はされていますか?
11
+ Python は、インデントが重要ですが、インデントについて理解はされていますか?
12
+
13
+ ----
14
+
15
+ 参考にされたサイトのようにするのであれば、前半で抽出して、リストに追加した linklist を利用してループする ` for page_url in linklist: ` を追加して、「# ③-⑦.画像ファイルの名前を抽出」から後ろの部分をインデントして、追加した for ループの中に入れてください。
16
+
17
+ また、`try:` や `except ValueError:` で実行する部分にもインデントが必要です。
18
+
19
+ 例(後半部分のみ記載)
20
+ ```Python
21
+ for page_url in linklist:
22
+ # ③-⑦.画像ファイルの名前を抽出
23
+ filename = re.search(".*/(.*png|.*jpg)$",link_url)
24
+ # ③-⑧.保存先のファイルパスを生成
25
+ save_path = output_folder.joinpath(filename.group(1))
26
+ time.sleep(1.0)
27
+ # ●画像ファイルのURLからデータをダウンロード
28
+ try:
29
+ # ④-①.画像ファイルのURLからデータを取得
30
+ image = requests.get(link_url)
31
+ # ④-②.保存先のファイルパスにデータを保存
32
+ open(save_path, 'wb').write(image.content)
33
+ # ④-③.保存したファイル名を表示
34
+ print(save_path)
35
+ time.sleep(1.0)
36
+ except ValueError:
37
+ # ④-④.失敗した場合はエラー表示
38
+ print("ValueError!")
39
+ ```

1

追記

2020/03/26 10:17

投稿

CHERRY
CHERRY

スコア25234

answer CHANGED
@@ -6,6 +6,6 @@
6
6
 
7
7
  ----
8
8
 
9
- もしかして、ループの中で実行しているつもりで書かれたコードでしょうか?
9
+ もしかして、画像を取得する部分もループの中で実行しているつもりで書かれたコードでしょうか?
10
10
 
11
- Python は、インデントが重要ですが、インデント理解されていない感じでしょうか?
11
+ Python は、インデントが重要ですが、インデントについて理解されていますか?