質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1013閲覧

ValueError: substring not found の解決方法を知りたい

spot_0104

総合スコア5

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2023/03/21 07:52

編集2023/03/21 08:40

実現したいこと

・ポケモンの画像をスクレイピングにて取得したい

前提

初歩的な質問となってしまい、申し訳ありません。
現在pythonのスクレイピングを勉強しています。
google colabにてポケモンの画像データをスクレイピングで取得するというコードをネット記事を参考にしながら作成中です。
コードの作成中に以下のエラーメッセージが発生しました。

・作成したコード

python

1```python 2from bs4 import BeautifulSoup 3import urllib.error 4import urllib.request 5import time 6import re 7import os 8 9#画像の保存場所 10from pathlib import Path 11dst_path = Path('img') 12dst_path.mkdir(exist_ok=True) 13dst_path = Path('img/pokemon') 14dst_path.mkdir(exist_ok=True) 15download_dir = 'download/pokemon' 16 17#ユーザーエージェント設定(コピペOK) 18ua = 'Mozilla/5.0(Macintosh; Intel Mac Os X 10_12_3)' 19'AppleWebKit/537.3.(KHTML,Like Gecko)' 20'Chrome/55.0.2883.95 Safari/537.36' 21 22#画像のURLにアクセスして保存する関数 23def download_img(url,dst_path): 24 try: 25 data = urllib.request.urlopen(url).read() 26 with open(dst_path,mode='wb') as f: 27 f.write(data) 28 29 except urllib.error.URLError as e: 30 print("エラーが発生しました。") 31 print(e) 32 33#001~898までのリストを作成 34number_list = {'{:03}'.format(i) for i in range(1,898)} 35 36#欲しい情報があるURLの取得 37url_list = ['https://zukan.pokemon.co.jp/detail/{0}.htm'.format(number) for number in number_list] 38 39#繰り返し処理 40for url in url_list: 41 time.sleep(0.5) 42 43 #URLのHTMLから画像のURLを取得(Chrome上でCtrl + U した情報) 44 req = urllib.request.Request(url,headers = {'User-Agent':ua}) 45 html = urllib.request.urlopen(req) 46 soup = BeautifulSoup(html,"html.parser") 47 48 #画像のURLを取得 49 images = str(soup.find("meta",property="og:image")) 50 target = '"' 51 idx = images.find(target) 52 images = images[idx+1:] 53 box_end = images.index('"') 54 images_url = images[0:box_end] 55 56 #ナンバーを取得 57 number = str(soup.find("meta",property="og:url")) 58 59 #開始位置 60 target = '"' 61 idx = number.find(target) 62 number = number[idx+1:] 63 box_start = number.index('detail/') 64 65 #終了位置 66 box_end = number.index('.htm') 67 68 number = number[box_start+7:box_end-1] 69 70 #名前を取得 71 name = str(soup.find("meta",property="og:title")) 72 73 #開始位置 74 target = '"' 75 idx = name.find(target) 76 name = name[idx+1:] 77 78 #終了位置 79 box_end = name.index('|') 80 81 name = name[:box_end] 82 83 #保存ファイル名の設定 84 dst_path = os.path.join(download_dir + '/' + str(number) + '.png') 85 86 #画像保存 87 download_img(images_url,dst_path) 88 89 print(name + "!ゲットだぜっ!") 90 91print("処理が完了しました。")
### 発生している問題・エラーメッセージ --------------------------------------------------------------------------- ValueError Traceback (most recent call last) Cell In[12], line 63 60 box_start = number.index('detail/') 62 #終了位置 ---> 63 box_end = number.index('.htm') 65 number = number[box_start+7:box_end-1] 67 #名前を取得 ValueError: substring not found

試したこと

63 box_end = number.index('.html')の括弧内の文字を変えてみたりしましたが変化がありませんでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

melian

2023/03/21 07:56

box_end = number.index('.html') は、 box_end = number.index('.htm') ではないでしょうか。
dameo

2023/03/21 08:01 編集

他所様のサーバーにアクセスする際は、頻度が適切になるようにしないと大きな迷惑をかけます。 大量にダウンロードする場合はまずはローカルで動くようにして、その後「適切な頻度調整が出来る実装にしてから」 やりましょう。
spot_0104

2023/03/21 08:04

box_end = number.index('.htm')にしてみましたが、エラーコードの構文に変化はありませんでした。
spot_0104

2023/03/21 08:06

アドバイスありがとうございます。 サーバに負荷をかけないように5つの画像分で処理ができるかを確認してから実行しようと思います。
dameo

2023/03/21 08:09

いえ、ローカルで確認してください。絶対に迷惑かけないようにしてくださいね。
spot_0104

2023/03/21 08:11

はい、ローカル環境で確認を行っていきます。
melian

2023/03/21 08:15

なるほど、 <meta property="og:url" content="https://zukan.pokemon.co.jp/detail/0001"> となっているので、box_end は不要だと思います。 #終了位置 ##box_end = number.index('.htm') # 不要 number = number[box_start+7:]
spot_0104

2023/03/21 08:42

ありがとうございます。 コードを修正していただいたおかげで処理自体は最後まで行われたのですが、フォルダ内に画像が保存されませんでした。 原因が分かりましたら教えていただけると幸いです。
melian

2023/03/21 08:55

何度もごめんなさい、ダブルクォート以降にも文字列がありますので、正しくは以下の様になります。 #終了位置 box_end = number.index(target) number = number[box_start+7:box_end]
spot_0104

2023/03/21 09:24

何度もありがとうございます。 上記の通りにコードを修正したところ、 box_end = number.index(target)の部分に ValueError: substring not found のエラーコードが表示されました。 number.index(target)をname.index(target)にしたりしましたが、改善されませんでした。 何度もお手数おかけしますが、解法が分かりましたら教えていただけると幸いです。
melian

2023/03/21 09:41

こちらで試すかぎり、画像ファイルが download/pokemon/ 以下に保存されます。(0001.png, 0002.png, ...)
spot_0104

2023/03/21 15:27

コードを再度入力して試したところ正常に動作することが確認できました。 何度も質問に答えていただきありがとうございます。助かりました。
guest

回答1

0

自己解決

質問のコメントから以下のように修正することで問題が解決しました。

#終了位置

number = number[box_start+7:]

投稿2023/05/26 11:32

spot_0104

総合スコア5

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問