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

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

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

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

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python

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

Q&A

解決済

1回答

717閲覧

Pythonで複数ページからスクレイピングしたい

Yellows

総合スコア13

スクレイピング

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

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python

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

0グッド

0クリップ

投稿2019/07/15 04:27

前提・実現したいこと

はじめまして、独学でPythonを勉強してる大学生です。
現在Pythonを使ったWebスクレイピングの練習として、食べログのサイトから東京にあるラーメン屋さん全件の名前、星数、URLを取得してDataFrame型に落とし込もうとしています。

まず1ページ目のみからのデータ取得は成功したのですが、複数ページからのデータ取得をしようとしたところ以下のようなErrorが発生し、自身ではわからなかったので、以下の2点をこちらで質問させていただきたいです。

  1. Errorの理由

食べログの場合、お店によって星数がついていないものもあり、それがNoneTypeとして反映されているのかなと推測しています。

  1. もし上記の理由の場合、星数がついていないものは0と返し、星数がついているものはその文字列を返す、といった指示をどうやって与えたら良いか。

お手数ではございますが、よろしくお願いいたします。

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

AttributeError Traceback (most recent call last) <ipython-input-28-13bbdc9603ba> in <module> 17 for i in tags: 18 name = i.find('a', 'list-rst__rst-name-target cpy-rst-name').string ---> 19 star = i.find(class_ = 'c-rating__val c-rating__val--strong list-rst__rating-val').string 20 url = i.a.get('href') 21 se = pd.Series([name, star, url], columns) AttributeError: 'NoneType' object has no attribute 'string'

該当のソースコード

Python

1base_url_1 = 'https://tabelog.com/tokyo/rstLst/MC/' 2base_url_2 = '/?LstReserve=0&LstSmoking=0&svd=20190715&svt=1900&svps=2&vac_net=0' 3num = 1 4 5columns = ['Name', 'Star', 'URL'] 6df = pd.DataFrame(columns = columns) 7 8 9while num <= 100: 10 url = base_url_1 + str(num) + base_url_2 11 res = requests.get(url) 12 soup = BeautifulSoup(res.text, 'html.parser') 13 num += 1 14 15 tags = soup.find_all('div', 'list-rst__wrap js-open-new-window') 16 17 for i in tags: 18 name = i.find('a', 'list-rst__rst-name-target cpy-rst-name').string 19 star = i.find(class_ = 'c-rating__val c-rating__val--strong list-rst__rating-val').string 20 url = i.a.get('href') 21 se = pd.Series([name, star, url], columns) 22 df = df.append(se, columns) 23df

試したこと

1ページ目からのみのデータ取得を試したところ、成功しました。
全ページから取得しようとしたところ、上記のErrorが起きてしまいました。

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

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

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

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

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

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

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

t_obara

2019/07/15 05:23

貴殿の推測通りだとした場合、findの戻りがNoneか否かと言う条件にすれば良いのでは?
Yellows

2019/07/15 05:43

t_obaraさん 教えていただいた通りに実行したところ、成功できました! 簡単なところでつまずいてお恥ずかしい限りですが、対応していただき、誠にありがとうございました。
guest

回答1

0

自己解決

t_obaraさんにコメントで教えていただいた通り、findの戻りがNoneか否かと言う条件に設定したところ、解決できました。

具体的には、以下のように記入しました。

if i.find(class_ = 'c-rating__val c-rating__val--strong list-rst__rating-val') == None:
star == 0

else:
star = i.find(class_ = 'c-rating__val c-rating__val--strong list-rst__rating-val').string

投稿2019/07/15 05:46

Yellows

総合スコア13

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問