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

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

新規登録して質問してみよう
ただいま回答率
85.48%
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

1回答

590閲覧

食べログのスクレイピング 点数が存在しない場合

engengeng9

総合スコア4

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2023/01/05 06:00

前提

pythonもteratailも初心者なので、
質問に際し、至らぬ点があったら申し訳ありません。

学校の課題で"負荷をかけない程度"に食べログのスクレイピングをしているのですが、
調べても解決の糸口が見つけれらず困っているので、質問させていただきます。

実現したいこと

①「店名」「点数」を抽出
② データフレーム化
③ 点数が存在しない店の「点数」はハイフンとする
④ データフレームをcsvで出力

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

■問題点
・点数の存在しない店があるため、取得した情報を.textで辞書に格納出来ない
・出力されるファイルは、点数はタグ形式、点数が無い場合はNoneになっている

■解決策の案1
上記①の抽出段階で、点数が存在しない店の点数をハイフンにして.textで辞書格納し、データフレーム化

■解決策の案2(案1が出来なければ)
とりあえず.textではない形式で辞書格納してデータフレーム化、DF上で、タグ形式で格納されている点数をテキストに、Noneをハイフンに置換

該当のソースコード

# ライブラリのインポート from time import sleep from bs4 import BeautifulSoup import requests import pandas as pd # 変数urlにホームページのURLを格納する url='https://tabelog.com/rstLst/{}/?svd=&svt=1900' # 変数d_listに空のリストを作成する d_list = [] # アクセスするためのURLをtarget_urlに格納する for i in range(1, 2): target_url = url.format(i) # target_urlへのアクセス結果を、変数rに格納 r = requests.get(target_url) sleep(1) # 取得結果を解析してsoupに格納 soup = BeautifulSoup(r.text) #口コミをを取得する contents = soup.find_all('div', class_=('list-rst__contents')) # 店名、点数をforループで取得 for content in contents: # 店名を変数nameに格納する name=content.find('h3',class_='list-rst__rst-name') # 点数を変数rateに格納する rate=content.find('span',class_='c-rating__val c-rating__val--strong list-rst__rating-val') # 取得したすべての情報を辞書に格納する d = { 'name': name.text, 'rate': rate } # 取得した辞書をd_listに格納する d_list.append(d) # 変数d_listを使って、データフレームを作成する df = pd.DataFrame(d_list)

試したこと

案1:if文でNoneはハイフンそれ以外はテキスト部分のみ抜き出そうとしましたが、エラーが出ました
案2:Noneをハイフンに変換する方法は分かったものの、タグ形式をテキストにする方法が見つかりませんでした

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

ここにより詳細な情報を記載してください。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TakaiY

2023/01/05 06:26

変換は「d = { 'name': name.text, 'rate': rate }」となっているところ(縮めてますが)あたりでやるのがよさそうですが、「Noneをハイフンに変換する方法は分かったものの、タグ形式をテキストにする方法が見つかりませんでした」これの意味がよくわかりません。 「タグ形式」といっているものもテキストだと思いますが、どのようなタグ付き文字列になるのでしょう?
engengeng9

2023/01/05 09:27 編集

説明が不足しており失礼いたしました。 「タグ形式の文字列」という表現が合っているか定かではないのですが、以下のようにファイル出力されます。 rateに格納されている文字列を「タグ形式の文字列」と記載しておりました。 -- name,rate "チャ~ボン多福楼 京橋店", "<span class=""c-rating__val c-rating__val--strong list-rst__rating-val"">3.25</span>", --
meg_

2023/01/05 10:35

> 学校の課題で"負荷をかけない程度"に食べログのスクレイピングをしている 食べログの利用規約には禁止事項として下記が書かれています。学校に本当にスクレイピングしても良いのか確認された方が良いかもしれません。 > [1]法令上又は本規約若しくはガイドライン上特に認められている場合を除き、食べログの提供する情報を当社の事前の同意なく、複写、若しくはその他の方法により再生、複製、送付、譲渡、頒布、配布、転売、又はこれらの目的で使用するために保管すること
guest

回答1

0

ベストアンサー

とりあえず動かすだけならこんな感じですかね。

python

1# 点数を変数rateに格納する 2rate = content.find('span', class_='c-rating__val c-rating__val--strong list-rst__rating-val') # 原文ママ 3# 以下追加 4if rate is None: 5 rate = '-' 6else: 7 rate = rate.text

あと個人的には

python

1soup = BeautifulSoup(r.text, features="lxml")

python

1'name': name.text.rstrip(),

も入れておきたいところ。(nameのrstripは最初にnameを作るところで入れた方がきれいかもしれません。)

投稿2023/01/05 07:12

poto568

総合スコア258

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

engengeng9

2023/01/05 09:36

ご教示いただきありがとうございました。 3日間色々漁っていたのに、即解決して感動しております。 elseの後にrate = rate.textを書くというところに辿り着けていなかったです。 lxmlは初耳だったのでこれから調べます。 nameの右側の文字、気になっていたのでrstripも大変助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問