3枚目の画像のスクレイピングするには
テストブログにもう一枚画像を追加し、image_url = parse.urljoin(url, bs4img[2][“src”])にしてRunしましたが、2枚目ではなく一枚目の画像が取得されました。何故ですか?
画像を追加しても bs4img[2] で1枚目が取得された理由は、「Beautiful Soupが認識しているHTMLの順番」と「私たちがブラウザで見た時の見た目の順番」が必ずしも一致しないからです。
2025年現在、Webサイト制作(WordPressなど)ではよくある現象ですが、主な原因は以下の3つが考えられます。
1. 目に見えない「隠れた画像」が先にある
HTMLコード上では、ページ上部のメニュー、アイコン、背景用のロゴなどが、記事の画像よりも先に <img> タグとして記述されていることがよくあります。
bs4img[0]:サイトロゴ
bs4img[1]:メニュー用アイコン
bs4img[2]:ようやくヘッダー画像
というように、インデックスがズレている可能性があります。
2. コード上の記述順とレイアウトが逆
CSS(デザイン設定)によって、HTML上では下に書いてある画像を上に表示させたり、その逆を行っている場合があります。
Beautiful Soupの select(“img”) は、あくまで「HTMLのソースコードを上から順番に」読み込みます。
3. キャッシュや同期の問題
OneDriveやブログ側のキャッシュにより、追加した画像がまだHTMLソースコードに反映されていない可能性があります。
対策:今、何番目がどの画像かを確認する方法
プログラムの途中に以下の1行を入れて、一度実行してみてください。
python
# 取得したすべての画像のURLを表示する
for i, img in enumerate(bs4img):
print(f"番号 {i}: {img.get('src')}")
これを実行すると、ターミナルに以下のようなリストが表示されます。
番号 0: /logo.png
番号 1: /header.jpg
番号 2: /test-image.jpg …
これを見れば、「自分が取りたい画像が本当は何番目なのか」が一目でわかります。
より確実な取得方法
インデックス(番号)指定はサイトが更新されるとすぐにズレてしまいます。もし特定の画像だけを狙いたいなら、HTMLの「クラス名」などで絞り込むのが2025年現在の主流です。
例: soup.select(“.post-content img”) (記事の中にある画像だけを取得する)
まずは print でリストの中身を覗いて、2枚目がどの番号になっているか確認してみてください!
画像の番号表
プログラムの途中に取得したすべての画像のURLを表示するプログラムを入れてRunしてみました。
番号 0: https://py.k-hp.com/wp-content/uploads/2025/12/Home.png
番号 1: https://py.k-hp.com/wp-content/uploads/2025/12/f7c3ee95.jpg
番号 2: https://py.k-hp.com/wp-content/uploads/2025/12/f7c3ee95-300x211.jpg
番号 3: https://py.k-hp.com/wp-content/uploads/2025/12/Cocoon-eyechach-300x177.webp
番号 4: https://py.k-hp.com/wp-content/uploads/2025/12/1119101179_01-300x186.png
番号 5: https://py.k-hp.com/wp-content/uploads/2025/12/beginner_programming_error_title2-e1766165359852-160x90.webp
番号 6: https://py.k-hp.com/wp-content/uploads/2025/12/Frame-339-e1766148431124-160x90.png
番号 7: https://py.k-hp.com/wp-content/uploads/2025/12/アイキャッチ-8-768x479-1-160x90.jpg
番号 8: https://py.k-hp.com/wp-content/uploads/2025/12/1119101179_01-160x90.png
番号 9: https://py.k-hp.com/wp-content/uploads/2025/12/s-1200x730_fa042a3b-671d-4a7f-ba8d-bfc9f3a8bce6-160x90.webp
番号 10: https://py.k-hp.com/wp-content/uploads/2025/12/python-error-message-160x90.png
番号 11: https://py.k-hp.com/wp-content/uploads/2025/12/python-error-message-120x68.png
番号 12: https://py.k-hp.com/wp-content/uploads/2025/12/python-error-message-120x68.png
番号 13: https://py.k-hp.com/wp-content/uploads/2025/12/python-error-message-120x68.png
番号 14: https://py.k-hp.com/wp-content/uploads/2025/12/f7c3ee95-120x68.jpg
番号 15: https://py.k-hp.com/wp-content/uploads/2025/12/python-error-message-120x68.png
番号 16: https://py.k-hp.com/wp-content/uploads/2025/12/1119101179_01-120x68.png
番号 17: https://py.k-hp.com/wp-content/uploads/2025/12/beginner_programming_error_title2-e1766165359852-120x68.webp
番号 18: https://py.k-hp.com/wp-content/uploads/2025/12/Home.png
なるほどいろいろ画像が定義されているもんですね。
画像の原寸表示について
そういえばワードプレスでは画像を保存するとき設定にもよりますが、各種の大きさを同時に保存するような仕様だった気がします。
番号 0: https://py.k-hp.com/wp-content/uploads/2025/12/Home.png
番号 1: https://py.k-hp.com/wp-content/uploads/2025/12/f7c3ee95.jpg
番号 2: https://py.k-hp.com/wp-content/uploads/2025/12/f7c3ee95-300×211.jpg
ところで取得した画像をエクセルでは、原型の大きさPxでは表示できないのですか?縮小されているように見えるのですが。
その通りです!出力結果を見ると、WordPress特有の動作(サムネイル生成)がはっきりと確認できますね。
番号1(元画像)に対して、番号2(300×211)はWordPressが自動生成した「中サイズ」の画像です。このように、HTML上には一つの画像に対して複数のサイズが記述されるため、インデックス番号だけで指定すると意図しないサイズや順番を掴んでしまうことがあります。
Excelで画像が縮小されて見える理由
プログラムの中に以下の記述があることが原因です。
python
image.width = 80
image.height = 120
この数値は「ピクセル(px)」ではなく、「ポイント(pt)」に近いExcel独自の単位でサイズを強制的に固定しています。元画像がどんなに大きくても、この命令によって小さく(あるいは歪んで)表示されてしまいます。
原寸大(オリジナルの大きさ)で表示する方法
2025年現在、openpyxlで画像を原寸大で表示するには、サイズ指定の行を削除(またはコメントアウト)するだけでOKです。
python
# image.width = 80 # ← この行を削除
# image.height = 120 # ← この行を削除
ws.add_image(image, ws["B1"].coordinate)
これを消すと、Pythonは画像の「解像度情報(DPI)」を読み取り、Excel上で可能な限りオリジナルの比率とサイズで展開します。
注意点:Excelの仕様による「見た目」の変化
ただし、原寸大で表示しても以下の理由で「少し違う」と感じることがあります。
Excelのセルの大きさ:
Excelは画像を「セルの中に格納」するのではなく「セルの上に浮かせる」構造です。画像が巨大な場合、セルからはみ出して表示されます。
DPI(解像度)の影響:
Web用の画像は通常72dpiや96dpiですが、Excelは内部で別の基準(多くは96dpi)を使うため、画面上のピクセル数とExcel上の見た目のサイズが100%一致しないことがあります。
2025年のTips:セルにフィットさせたい場合
もし「縮小したくないが、セルからはみ出すのも困る」という場合は、画像の縦横比を維持したままセルの幅に合わせる計算をPythonで行うのが一般的です。
まずはサイズ指定の2行を消して、実行してみてください。驚くほど巨大に表示されるかもしれませんが、それがその画像の「本来のサイズ」です!



コメント