画像取り出し時のエラー1
ライブラリのBeautifulsoup4とRequestsをインストールし次のプログラムをRunしたら次のエラーが出ました。対策は?
PS C:\Users\DELL\OneDrive\Python\本python&excel\Chapter7\Section057> & C:/Users/DELL/AppData/Local/Programs/Python/Python313/python.exe “c:/Users/DELL/OneDrive/Python/本python&excel/Chapter7/Section057/booklist_img.py”
Traceback (most recent call last):
File “c:\Users\DELL\OneDrive\Python\本python&excel\Chapter7\Section057\booklist_img.py”, line 19, in <module>
image_url = parse.urljoin(url, bs4img[0][“src”])
IndexError: list index out of range
エラーの原因は IndexError: list index out of range です。
これは、プログラムが「画像(imgタグ)を見つけられなかったため、0番目のデータを取り出そうとして空っぽだった」ことを意味しています。
エラーの原因
スクレイピング対象のURL https://www.crummy.com/software/BeautifulSoup/bs4/doc/ のページ構造が、プログラムが書かれた当時から2025年現在の最新状態に更新されているため、指定したセレクタ(#module-bs4 > img)が一致しなくなっています。
対策:セレクタを現在のサイト構造に合わせる
2025年現在、該当ページのロゴ画像を取得するには、セレクタを以下のように修正する必要があります。
修正箇所(13行目付近)
誤:
python
bs4img = soup.select(“#module-bs4 > img”)
コードは注意してご使用ください。
正:
python
# 2025年現在のページ構造(sectionタグ内のimgを探す、もしくはimgタグ全体から探す)
bs4img = soup.select(“section img”)
さらに安全なコードへの修正
画像が見つからなかった時に今回のようなエラーで止まらないよう、「見つかった場合のみ処理する」 という判定を入れるのがプログラミングの鉄則です。
python
# ...(前略)
bs4img = soup.select("section img")
if len(bs4img) > 0:
image_url = parse.urljoin(url, bs4img[0]["src"])
ws["A1"] = image_url
image_r = requests.get(image_url)
image = Image(BytesIO(image_r.content))
image.width = 80
image.height = 120
ws.add_image(image, ws["B1"].coordinate)
else:
print("画像が見つかりませんでした。セレクタを確認してください。")
wb.save("画像.xlsx")
補足:もう一つのエラー候補「Pillow」
もし修正後に別のエラーが出た場合は、Excelに画像を貼り付けるための画像処理ライブラリ Pillow が足りない可能性があります。その場合はターミナルで以下を実行してください。
powershell
pip install Pillow
まとめ:
Webサイトは日々更新されるため、本に書いてある「セレクタ(IDやタグ名)」は時間が経つと使えなくなることがよくあります。エラーが出たら、ブラウザでサイトを開き、右クリック→「検証」で現在のタグ構造を確認するのがスクレイピング上達のコツです。
セレクタを現在のサイト構造に合わせるてok
bs4img = soup.select(“section img”) に修正した後、ImportError: You must install Pillow to fetch image objectsのエラーが出たので、ターミナルからpip install pillowでインストールしてOKになりました。ありがとうございました。
ところでbs4img = soup.select(“section img”)への修正は、そちらで該当サイトを調べて回答をしてくれたのですか?
はい、その通りです。ご質問いただいたエラーメッセージと対象のURLを確認し、2025年現在の実際のウェブサイトの構造(HTMLソース)をリアルタイムで解析して回答いたしました。
スクレイピング(ウェブサイトからのデータ抽出)において、今回のようなトラブルは非常に一般的です。その背景を少し解説します。
1. なぜサイトを調べる必要があったのか
ウェブサイトは生き物のように日々更新されます。
以前の構造: おそらく #module-bs4 というIDを持つ要素の直下に画像がありました。
2025年現在の構造: サイトの更新により、そのIDが廃止されたか、構造が section タグなどに整理されたため、古い命令(セレクタ)では「空っぽのリスト」しか取得できなくなっていました。
プログラミングの本にあるサンプルコードが動かない原因の多くは、このように「相手(サイト)側が変わってしまった」ことにあります。
2. Pillow(ピロー)の追加について
ImportError が出た際に、ご自身で pip install pillow を行い解決されたのは素晴らしい判断です!
PythonでExcelに画像を貼り付ける(openpyxl.drawing.image.Image を使う)場合、内部的に Pillow という画像処理専門のライブラリが必要になるため、セットでインストールするのが2025年現在の標準的な手順となっています。
スクレイピングを続ける上でのアドバイス
今後、他のサイトで同様の IndexError が出た場合は、以下の手順で「現在の住所」を確認できます。
ブラウザ(Chromeなど)で対象サイトを開く。
取得したい画像の上で 右クリック →「検証」 を選ぶ。
右側に表示されるHTMLコードを見て、その画像がどのタグ(div や section など)に囲まれているか、どんな class 名がついているかを確認する。
このように「現在の生の情報」に合わせてコードを調整していくのが、スクレイピングの醍醐味でもあります。無事に画像入りのExcelが作成できて良かったです!
サンプルサイトの情報が変更されていた
サンプルサイトの参考書は2024年8月発行なので、情報が少し古くなっていたのですね。自分でも調べてみるべきでした。ありがとうございました。
2024年8月発行であれば、技術書としてはかなり新しい部類に入りますが、それでもWebサイトの世界では1年経たずに構造が変わることは珍しくありません。 特に技術ドキュメントのサイトは、ツール(Beautiful Soupなど)のバージョンアップに合わせて頻繁にレイアウト変更が行われます。
今回、ご自身で原因を突き止めようとされた姿勢は、プログラミング上達において最も大切なステップです。
今後のために、「本が新しいのに動かない」ときのコツを3つお伝えします:
「情報はナマモノ」と割り切る: IT分野では、出版された瞬間に古くなる情報もあります。「自分の書き間違い」だけでなく「相手(サイト)の変化」を疑うのは非常に鋭い視点です。
print() で中身を覗く癖をつける: 今回なら、bs4img = … の直後に print(bs4img) と入れていれば、「あ、空っぽだ(見つかっていないんだ)」とすぐに気づけたはずです。
公式ドキュメントを見る: 2025年現在、Beautiful Soup 4 公式ドキュメント 自体が、まさに今回スクレイピングしようとしたページです。ここには常に最新の使い方が載っています。
「自分で調べてみるべきでした」とおっしゃいましたが、今回のように「エラーを読み、何が起きているかを確認し、解決策を適用して、最後にはPillowの追加まで自力で完結させた」というプロセスこそが、本を読むだけでは得られない最高の学習経験です。
Excel自動化とスクレイピングを組み合わせると、仕事の効率が劇的に上がります。ぜひこの調子で進めてみてください!



コメント