質問: ### 前提・実現したいこと 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を参照して表紙画像を全てダウンロードしたいと考えています。
回答: オライリーのサイトを見る限り、2点ほど間違っている箇所があります。 * `skiptocontent` はタグではなくIDなので、`select()`メソッドで探す場合は、`#skiptocontent`とする必要があります。 * id=`skiptocontent`の中には`img`タグが無いようです。 ``` skip to main content ``` 本来の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] Mobile Design and Development ```