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

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

ただいまの
回答率

90.60%

  • Python 3.x

    5900questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

BeautifulSoupで画像をダウンロードしたい

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 271

kisamasaki

score 3

前提・実現したいこと

BeautifulSoupでオライリー社の本の表紙をまとめてダウンロードしたい。
Windowsにアナコンダをインストールして使っています。

発生している問題・エラーメッセージ

表紙画像が見つかりませんでした。
ページをダウンロード中http://www.oreilly.com/animals.csp...
表紙画像が見つかりませんでした。
ページをダウンロード中http://www.oreilly.com/animals.csp...
表紙画像が見つかりませんでした。
ページをダウンロード中http://www.oreilly.com/animals.csp...
表紙画像が見つかりませんでした。
ページをダウンロード中http://www.oreilly.com/animals.csp...

と出続ける

該当のソースコード

#! python3
# downloadoreilly.py

import requests,os,bs4

url='http://www.oreilly.com/animals.csp' #開始URL
os.makedirs('oreilly',exist_ok=True)     # ./oreillyに保存する

while not url.endswith('1000'):

    #ページをダウンロードする
    print('ページをダウンロード中{}...'.format(url))
    res=requests.get(url)
    res.raise_for_status()

    soup=bs4.BeautifulSoup(res.text)

    #表紙画像のURLを見つける
    oreilly_elem=soup.select('skiptocontent img')
    if oreilly_elem==[]:
        print('表紙画像が見つかりませんでした。')
    else:
        oreilly_url='http:'+oreilly_elem[0].get('src')
        #画像をダウンロードする
        print('画像をダウンロード中{}...'.format(oreilly_url))
        res=requests.get(oreilly_url)
        res.raise_for_status()

        #画像を./oreillyに保存する
        image_file=open(os.path.join('oreilly',os.path.basename(oreilly_url)),'wb')
        for chunk in res.iter_content(1000):
            image_file.write(chunk)
        image_file.close()

        #PrevボタンのURLを取得する
        prev_link=soup.select('a[rel="prev"]')[0]
        url='http://www.oreilly.com/animals.csp'+prev_link.get('href')

print('完了')

補足情報(言語/FW/ツール等のバージョンなど)

http://www.oreilly.com/animals.cspを参照して表紙画像を全てダウンロードしたいと考えています。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

オライリーのサイトを見る限り、2点ほど間違っている箇所があります。

  • skiptocontent はタグではなくIDなので、select()メソッドで探す場合は、#skiptocontentとする必要があります。
  • id=skiptocontentの中にはimgタグが無いようです。
<div id="skiptocontent">
    <a href="#maincontent"><span class="skiplink">skip to main content</span></a>
</div>

本来のimgタグをピックアップできるように、select()の内容を正しく選択する必要があります。
例を挙げると、下記のように指定すると対象となるimgタグをとれます。

>>> from urllib.request import urlopen
>>> import bs4
>>> url = 'http://www.oreilly.com/animals.csp'
>>> resp = urlopen(url)
>>>
>>> soup = bs4.BeautifulSoup(resp.read(), 'html.parser')
>>> oreilly_elem = soup.select('.animal-row img') # <-- ここ
>>> len(oreilly_elem)
20
>>> oreilly_elem[0]
<img class="book-cvr" src="http://covers.oreilly.com/images/9780596155452/cat.gif">
<h1 class="book-title">Mobile Design and Development</h1>
</img>

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/09 12:06

    ご返信ありがとうございます。指摘していただいた部分をskiptocontentから#animal-rowにしてから実行しましたが同じエラーが発生します。単に変更するだけでは解決できないのでしょうか。よろしくお願いいたします。

    キャンセル

  • 2017/09/09 16:10

    "#animal-row" ではなく、".animal-row" です。animal-rowはidではなくclassなので、#で指定するものではありません。

    キャンセル

  • 2017/09/09 19:53

    ご返信ありがとうございました。画像は最初の一枚目だけ保存されましたが、残りが保存されないといった状態です。コメント欄のスペース上再度ソースコード添付するのは不可能だと考え、再度改めて質問をしようと考えております。ありがとうございました。

    キャンセル

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

  • ただいまの回答率 90.60%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python 3.x

    5900questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。