前提・実現したいこと
当方、プログラミング初心者です。
飲み会でビールの銘柄を指定されることが多いのですが、
食べログではビールの銘柄での絞り込みができません。
そこで、食べログをスクレイピングして、店舗一覧ページ(エリアで絞り込み後)の中から、
店舗説明テキスト内に希望のビール銘柄が含まれている店舗を抽出し、
店名と評価を表示するプログラムを組みたいと考えております。
該当のソースコード
※途中まで作成したものです↓
python
1import requests 2from bs4 import BeautifulSoup 3 4#店舗一覧ページに対するBeautifulSoupの設定 5list_url = 'https://tabelog.com/tokyo/A1302/' 6r_list = requests.get(list_url) 7html_list = r_list.content 8soup_list = BeautifulSoup(html_list, "html.parser") 9 10#店舗一覧ページ内のURLリンクの抽出 11for aa in soup_list.find_all("a"): 12 link = aa.get("href") 13 name = aa.get_text() 14 print(link,"\t",name) 15 16 17#個別店舗ページに対するBeautifulSoupの設定 18target_url = 'https://tabelog.com/tokyo/A1312/A131201/13234764/dtlmenu/drink/' 19r = requests.get(target_url) 20html = r.content 21soup = BeautifulSoup(html, "html.parser") 22 23#個別店舗の店名を抽出 24store_name = soup.find(class_="display-name").text 25#print(store_name) 26 27#個別店舗の評価を抽出 28rating_score_tag = soup.find('b', class_='c-rating__val') 29rating_score = rating_score_tag.span.string 30 31#個別店舗ページ内のテキストを全取得 32all_text=soup.find(all).text 33 34#テキスト内に希望ビール銘柄が含まれていたら店名と評価を表示する 35if "アサヒ" in all_text: 36 print(store_name+rating_score)
できていること
・店舗一覧ページ内に記載のあるURLを抽出すること
・個別店舗ページ内のテキストにビール銘柄が含まれていたら店名と評価を表示すること**
###できていないこと
①店舗一覧ページに記載のあるURLすべてを抽出してしまっている
→個別店舗のリンクURLのみを抽出したいができていない
②上記①で個別店舗のリンクURLのみを抽出できたとして、リスト化の仕方がわからない
③上記②のリストから順番にtarget_urlに代入を繰り返す処理をしたいができていない
###つまづいているポイント
①については、個別店舗URLは下記のようなクラス設定がされているため、
find_allの際にクラス指定をすればよいのかと思ったが、やり方がわからない。
<a class="list-rst__rst-name-target cpy-rst-name js-ranking-num" target="_blank" data-list-dest="item_top" data-ranking="1" href="https://tabelog.com/tokyo/A1302/A130204/13018162/">日本橋蛎殻町 すぎた</a>
③については、コードの"#個別店舗ページに対するBeautifulSoupの設定"以下を
python
1def check(target_url): 2#個別店舗ページに対するBeautifulSoupの設定 3target_url = 'https://tabelog.com/tokyo/A1312/A131201/13234764/dtlmenu/drink/' 4r = requests.get(target_url) 5html = r.content 6soup = BeautifulSoup(html, "html.parser") 7#個別店舗の店名を抽出 8store_name = soup.find(class_="display-name").text 9#print(store_name) 10#個別店舗の評価を抽出 11rating_score_tag = soup.find('b', class_='c-rating__val') 12rating_score = rating_score_tag.span.string 13#個別店舗ページ内のテキストを全取得 14all_text=soup.find(all).text 15#テキスト内に希望ビール銘柄が含まれていたら店名と評価を表示する 16if "アサヒ" in all_text: 17 print(store_name+rating_score)
などとして関数化し、for文でtarget_urlにリストから順番にURLを代入させる?
というような方法でしょうか?イメージがついておりません。
コメントを下さった方、ありがとうございます。
自分なりに改めて考えて追記致しました。
Markdown記法についてはわかっていない部分が多く申し訳ございません。
不足している情報などございましたらご指摘頂けましたら幸いです。
宜しくお願い致します。
###(追記)修正したプログラム
ご回答ありがとうございます。
頂いたアドバイスを参考に下記の通り修正したところ、うまく動きました。
python
1import requests 2from bs4 import BeautifulSoup 3import sys 4 5#ページネーション(次の20件)を変数 i で表現。今回は10ページ目まで取得している 6#i は数値(int)のため、URLに入れ込む際には文字列(str)に変換している 7#rangeは通常0から始まるするため、引数として1を追加して、1から始まるようにしている 8for i in range(1, 10): 9 #URLの"A1302"は「東京・日本橋」のディレクトリのため、他のエリアの場合は手打ちで変更必要 10 list_url = "https://tabelog.com/tokyo/A1302/rstLst/"+str(i)+"/?Srt=D&SrtT=rt&sort_mode=1" 11 12 #店舗一覧ページに対するBeautifulSoupの設定 13 r_list = requests.get(list_url) 14 html_list = r_list.content 15 soup_list = BeautifulSoup(html_list, "html.parser") 16 17 #店舗一覧ページ内の個別店舗ページURLの抽出 18 stores = soup_list.find_all(class_="list-rst__rst-name-target") 19 storeURLs = [ x['href'] for x in stores ] 20 21 #個別店舗のドリンクメニューページを集めたリストを作成 22 #個別店舗ページURLの末尾にドリンクメニューのディレクトリを追記したものをリストへ追加 23 drinkURLs = [] 24 for storeURL in storeURLs: 25 drinkURL = storeURL +"dtlmenu/drink/" 26 drinkURLs.append(drinkURL) 27 28 #各店舗のドリンクメニューページに希望のビール銘柄の記載があるか、リスト内URLを順番に確認 29 for target_url in drinkURLs: 30 31 #個別店舗ドリンクページに対するBeautifulSoupの設定 32 r = requests.get(target_url) 33 html = r.content 34 soup = BeautifulSoup(html, "html.parser") 35 36 #個別店舗の店名を抽出 37 store_name = soup.find(class_="display-name").text 38 39 #個別店舗の評価を抽出 40 rating_score_tag = soup.find('b', class_='c-rating__val') 41 rating_score = rating_score_tag.span.string 42 43 #個別店舗ドリンクページ内のテキストを全取得 44 all_text=soup.find(all).text 45 46 #テキスト内に希望ビール銘柄の記載があれば、店名と評価を表示する 47 #記載がなければ、その旨を表示する 48 if "キリン" in all_text: 49 print(store_name+rating_score) 50 else: 51 print(store_name+"キリンは置いていません") 52
回答1件
あなたの回答
tips
プレビュー