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

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

ただいまの
回答率

87.59%

Python 食べログで検索したページの店舗名、点数、URLを取得したいです。

解決済

回答 1

投稿 編集

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

score 25

Python初めて数日の初心者で、プログラミングも勉強始めたばかりです。
最終的にWebスクレイピングができるようになりたいと思っています。

検索してもわからなく、つまづいているので詳しい方教えて下さいm(__)m

Windows10のコマンドプロンプトから実行しています。

★やりたいこと★

食べログで「新橋」「個室」で検索したURLを元に、 店舗名、点数、URLを取得したいです。

■問題■
「店舗名とURL」、「点数」のみ、で個別に取得することはなんとかできたのですが、
合わせる方法がわからず困っています。

理想としては「店舗名」「点数」「URL」をリストにしてエクセルに出力したいです。(ここはまだ勉強中です)

★使用しているコード★
「店舗名とURL」のコードと結果

 import requests
 from bs4 import BeautifulSoup

 url = "https://tabelog.com/tokyo/A1301/A130103/R5266/rstLst/?vs=1&sa=%E6%96%B0%E6%A9%8B%E9%A7%85&sk=%25E5%2580%258B%25E5%25AE%25A4&lid=hd_search1&vac_net=&svd=20200323&svt=1900&svps=2&hfc=1&ChkRoom=1&cat_sk=%E5%80%8B%E5%AE%A4"
 response = requests.get(url)
 soup = BeautifulSoup(response.content, 'html.parser')

 tags = soup.find_all("a", class_="list-rst__rst-name-target cpy-rst-name")
 for i in tags:
...   print('name:{} url:{}'.format(i.text, i.get("href")))
...
name:ビアホール ビヤケラー東京 新橋銀座口店 url:https://tabelog.com/tokyo/A1301/A130103/13171590/
name:旬魚と個室 和食りん  新橋本店 url:https://tabelog.com/tokyo/A1301/A130103/13100377/
name:プレミアムレストラン 東京 金のダイニング 鮪金 url:https://tabelog.com/tokyo/A1301/A130101/13200206/
name:DESIGN FOOD MARKET 新橋店 url:https://tabelog.com/tokyo/A1301/A130103/13197015/
name:宴会個室 肉寿司 肉食居酒屋 がむしゃら 新橋総本店 url:https://tabelog.com/tokyo/A1301/A130103/13212570/
name:鳥元 虎ノ門店 url:https://tabelog.com/tokyo/A1308/A130802/13019433/
name:割烹・一品料理 わくら 銀座店 url:https://tabelog.com/tokyo/A1301/A130101/13191311/
name:リザラン 新橋店 url:https://tabelog.com/tokyo/A1301/A130103/13211102/
name:鉄板焼 ステーキ 集 銀座 url:https://tabelog.com/tokyo/A1301/A130103/13234842/
name:官兵衛 url:https://tabelog.com/tokyo/A1301/A130103/13041136/
name:無何有 url:https://tabelog.com/tokyo/A1301/A130103/13101397/
name:上越やすだ 新橋銀座口店 url:https://tabelog.com/tokyo/A1301/A130103/13189504/
name:海鮮個室居酒屋 瀬戸 新橋店 url:https://tabelog.com/tokyo/A1301/A130103/13214639/
name:京都 瓢喜 新橋店 url:https://tabelog.com/tokyo/A1301/A130103/13197226/
name:肉魚酒場 肉浜 新橋店 url:https://tabelog.com/tokyo/A1301/A130103/13231985/
name:NEO‐SNAPPER CARNAVAL url:https://tabelog.com/tokyo/A1301/A130101/13030373/
name:京都 瓢喜 銀座本店 url:https://tabelog.com/tokyo/A1301/A130101/13101843/
name:個室会席 北大路 銀座本店 url:https://tabelog.com/tokyo/A1301/A130103/13019429/
name:陸州や url:https://tabelog.com/tokyo/A1301/A130103/13227422/
name:個室 塊肉×農園野菜 Nick&Noojoo 新橋本店 url:https://tabelog.com/tokyo/A1301/A130103/13229555/


**「点数」のコードと結果**

 import requests
 from bs4 import BeautifulSoup

 url = "https://tabelog.com/tokyo/A1301/A130103/R5266/rstLst/?vs=1&sa=%E6%96%B0%E6%A9%8B%E9%A7%85&sk=%25E5%2580%258B%25E5%25AE%25A4&lid=hd_search1&vac_net=&svd=20200323&svt=1900&svps=2&hfc=1&ChkRoom=1&cat_sk=%E5%80%8B%E5%AE%A4"
 response = requests.get(url)
 soup = BeautifulSoup(response.content, "html.parser")

 lists = soup.find_all("span", class_="list-rst__rating-val")

 for list in lists:
...     print(list.text)
...
3.32
3.44
3.35
3.38
3.06
3.19
3.05
3.26
3.05
3.37
3.14
3.51
3.10
3.09
3.06
3.29
3.51
3.40
3.01
3.40
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • pythonbegginer

    2020/03/24 14:29

    はい

    キャンセル

  • m.ts10806

    2020/03/24 14:32

    質問本文のコード修正してください。
    PCから確認されたら分かりますが、コードブロックの右上の++ボタンを押すとその内容がコピーされます。
    実際のコードにないものが入ってくると手元で再現確認するために取り除く作業が発生して手間になりますし、他人なのでどこまで実際のコードかどうかは判断できません

    キャンセル

  • pythonbegginer

    2020/03/24 14:38

    直しました!

    キャンセル

回答 1

checkベストアンサー

+1

まずは、考え方を...

全店舗のデータから find_allで、「項目」をまとめて取得処理しているから、項目別にばらばらに取得されています。

まず1店舗分のデータを取り出して、
1店舗分のデータから「店舗名」「点数」「URL」を取り出す
というのを店舗数分繰り返す

という処理で可能です。

質問に記載のコードが書けていたら、書けると思いますのでまずは考えてみてください。

ヒントとしては、1店舗分を取り出す処理は、soup まではそのまま使って、下記のような感じでしょうか。

restrants = soup.find_all("div", class_="list-rst__wrap js-open-new-window")

for restrant in restrants:
    # 1件分の項目取得処理を書く

2020.03.25 追記

質問のコードを流用して、下記のコードを書いて試してみました。

import requests
from bs4 import BeautifulSoup

url = "https://tabelog.com/tokyo/A1301/A130103/R5266/rstLst/?vs=1&sa=%E6%96%B0%E6%A9%8B%E9%A7%85&sk=%25E5%2580%258B%25E5%25AE%25A4&lid=hd_search1&vac_net=&svd=20200323&svt=1900&svps=2&hfc=1&ChkRoom=1&cat_sk=%E5%80%8B%E5%AE%A4"

response = requests.get(url)
soup = BeautifulSoup(response.content, 'html.parser')
restrants = soup.find_all("div", class_="list-rst__wrap js-open-new-window")

for restrant in restrants:
    shopname = restrant.find("a", class_="list-rst__rst-name-target cpy-rst-name")
    star = restrant.find("span", class_="list-rst__rating-val")
    print('name:{} url:{} star:{}'.format(shopname.text, shopname.get("href"), star.text))


のプログラムを実行したところ

name:アンジェロ url:https://tabelog.com/tokyo/A1301/A130101/13015364/ star:3.26
name:鳥元 虎ノ門店 url:https://tabelog.com/tokyo/A1308/A130802/13019433/ star:3.19
name:佐賀牛グリルイタリアン ドルチェヴィータ 銀座 url:https://tabelog.com/tokyo/A1301/A130101/13168844/ star:3.06
name:おば九 新橋駅前店 url:https://tabelog.com/tokyo/A1301/A130103/13110976/ star:3.19
name:伍法 url:https://tabelog.com/tokyo/A1301/A130103/13127305/ star:3.48
name:個室×ビストロ Borghini 新橋店 url:https://tabelog.com/tokyo/A1301/A130103/13234671/ star:3.09
name:個室×ラクレットチーズ プラチナフィッシュ ガーデンキッチン  url:https://tabelog.com/tokyo/A1301/A130103/13199175/ star:3.10
name:ぬる燗 佐藤 銀座店 url:https://tabelog.com/tokyo/A1301/A130103/13195789/ star:3.40
name:大衆酒場 一升瓶 url:https://tabelog.com/tokyo/A1301/A130103/13185179/ star:3.06
name:神戸牛しゃぶしゃぶ・焼肉 嵯峨野 url:https://tabelog.com/tokyo/A1301/A130103/13047097/ star:3.09
name:MEAT KITCHEN 新橋店 url:https://tabelog.com/tokyo/A1301/A130103/13217264/ star:3.02
name:福炎や url:https://tabelog.com/tokyo/A1301/A130103/13047799/ star:3.29
name:わびさび SHINOBI url:https://tabelog.com/tokyo/A1301/A130103/13027344/ star:3.33
name:入母屋 別邸 銀座七丁目店 url:https://tabelog.com/tokyo/A1301/A130101/13019693/ star:3.42
name:銀座むらき url:https://tabelog.com/tokyo/A1301/A130101/13014857/ star:3.34
name:南国亭 新橋日比谷店 url:https://tabelog.com/tokyo/A1301/A130103/13200776/ star:3.03
name:東京立ち飲みバル url:https://tabelog.com/tokyo/A1301/A130103/13148777/ star:3.24
name:炭の屋でですけ url:https://tabelog.com/tokyo/A1301/A130103/13132578/ star:3.34
name:車 銀座8丁目店 url:https://tabelog.com/tokyo/A1301/A130103/13043449/ star:3.09
name:銀座柊家 url:https://tabelog.com/tokyo/A1301/A130102/13221080/ star:3.10


となり、Webブラウザ(シークレットモード/プライベートモード)で確認してみた感じでは、

イメージ説明

と同じ結果になっていました。

AttributeError: 'NoneType' object has no attribute 'text'

のエラーの件ですが、API 側から返ってくるデータに依存していると思われるのですが、手元では再現しないので具体的な原因は不明です。
エラーメッセージ的には、`<span class_="list-rst__rating-val">〜</span> が取得できない(返ってくるデータにない?)のだと思います。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/03/24 16:31

    出先なのにありがとうございますm(__)m
    すごい無知ですいません。調べてやってみます。

    キャンセル

  • 2020/03/24 16:41

    何度もすいません。

    AttributeError: 'NoneType' object has no attribute 'text'

    というエラーがでてしまって。。
    textをなくすと、点数含むclassないのコードが全て取得できますm(__)m
    宜しくお願いします。

    キャンセル

  • 2020/03/25 10:38

    丁寧かつわかりやすい説明本当にありがとうございます(´;ω;`)!!!

    無事できたのと、コードも全て理解できました。まだ始めたばかりでわからないこともありますが、こんな風にできるように頑張ります!

    ありがとうございます^^

    キャンセル

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

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

関連した質問

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