前提・実現したいこと
Python初心者です。Qiitaのhttps://qiita.com/cocet33000/items/7beb9e67be6ca07acd15
におけるサンプルコードを実装したいのですがエラーが改善できず実行できないので改善方法を教えて欲しいです。jupyter notebookで実行しています。
発生している問題・エラーメッセージ
Error --------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-26-6c2b0f96e446> in <module> 8 URL = 'https://www.fashion-press.net/snaps/sex/mens?page=' + str(page) 9 soup = openURL(URL) ---> 10 snaps = soup.find_all(attrs={'class': 'fp_media_tile'}) 11 12 if len(snaps) != 0: # 写真がある場合はブランドを取得 AttributeError: 'bool' object has no attribute 'find_all'
該当のソースコード
Python
1import re 2import uuid 3 4from bs4 import BeautifulSoup 5import requests 6import numpy as np 7import pandas as pd 8import collections 9 10# URLからbs4オブジェクトを生成 11def openURL(URL:int): 12 res = requests.get(URL) 13 if res.status_code != requests.codes.ok: 14 print('Error') 15 return(False) 16 return BeautifulSoup(res.text) 17 18# bs4オブジェクトから着用ブランドのリストを取得 19def getBrandList(snaps): 20 BrandList = [] 21 for snap in snaps: 22 BrandList.append(list(set(map(lambda x: x.text, snap.find_all('a', attrs = {'href':re.compile('^/snaps/brand')}))))) #1コーデに同ブランドは1つまで 23 24 return BrandList 25 26# bs4オブジェクトから名前を取得 27def getNameList(snaps): 28 NameList = [] 29 for snap in snaps: 30 NameList.append(snap.find('a')['title']) 31 return NameList 32 33if __name__ == '__main__': 34 flag = True 35 page = 1 36 BrandList = [] 37 NameList = [] 38 39 while flag: 40 URL = 'https://www.fashion-press.net/snaps/sex/mens?page=' + str(page) 41 soup = openURL(URL) 42 snaps = soup.find_all(attrs = {'class':'fp_media_tile'}) 43 44 45 if len(snaps) != 0: #写真がある場合はブランドを取得 46 tmpBrandList = getBrandList(snaps) 47 BrandList.extend(tmpBrandList) 48 NameList.extend(getNameList(snaps)) 49 print('get page' + str(page)) 50 page += 1 51 52 else: #写真がない場合は終了 53 flag = False 54 print('END') 55 56 df = pd.DataFrame(data=BrandList, index=NameList) #pandasのDataFrame型に 57 df.to_csv('StreetSnapMen.csv') # csv形式で保存
補足
find_allを何かに変えれば良いのでしょうか?
丁寧に教えてもらえると幸いです。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
これ、サンプルコードを実装というか、サンプルコードをそのまま丸ごとコピーして実行してこのような結果になっているのでしょうか??
そうです!
なので実行結果は
>>> df.shape
(1492, 8)
のようになるはずなのですがならなかったので修正点(どこをどのように修正すれば良いか)を教えて欲しいです
であればotnさんの回答の通りです。
関数openURL()からFalseというbool値が返ってきているため、それに対してfind_allというメソッドを実行しようとして、「bool型にはfind_allは無いよ」と言われています。
解決策は多分…無いですね。
そのURLに対してブラウザでアクセスするとアクセスできるのにプログラムからアクセスしようとするとエラーになるというのは…スクレイピングされないように何らかの対策をされたような気がします。
サンプルコード、2年以上前のものっぽいですしね。
ああ・・・無いというかあるにはありますが、相手が拒否しているものの突破方法を教えるのはモラルとしてあれなんで・・・それは自分で考えて下さいとしか言えないですね。
わかりました...丁寧な解答ありがとうございます!