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

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

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

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

date

dateは、date型や日付に関する関数や処理についてのタグです

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

Python

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

データマイニング

データマイニングは、購買履歴やクレジットカードの利用履歴、電話の通話履歴など企業にある大量のデータを解析して、その中に隠れたパターンやルールを探し出す技術です。DMと略されることもあります。

Q&A

解決済

1回答

2328閲覧

【python】データフレームに欲しいデータが入りません。

hunimojiko

総合スコア1

スクレイピング

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

date

dateは、date型や日付に関する関数や処理についてのタグです

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

Python

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

データマイニング

データマイニングは、購買履歴やクレジットカードの利用履歴、電話の通話履歴など企業にある大量のデータを解析して、その中に隠れたパターンやルールを探し出す技術です。DMと略されることもあります。

0グッド

0クリップ

投稿2022/01/08 06:32

編集2022/01/08 07:31

前提・実現したいこと

pythonで「じゃらん」の口コミをスクレイピングしようとしているのですが、データフレームが空になってしまいます。データが表示されるようにするにはどうしたらよいでしょうか。

sns.countplot('sex', data = data)を実行すると、以下のようなメッセージが表示されます。

ValueError: min() arg is an empty sequence

また、print(data)で内容を確認したところ、

Empty DataFrame
Columns: [sex, age, value, date, trip, price]
Index: []

と表示され、データが入っていないようです。
初学者ですが、ご教授願います。

コードはhttps://www.acceluniverse.com/blog/developers/2020/01/post-36.htmlから拝借しました。

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

ValueError: min() arg is an empty sequence

該当のソースコード

python

1from bs4 import BeautifulSoup 2import urllib 3import pandas as pd 4import requests 5import seaborn as sns 6 7html = requests.get('取得したい観光地の口コミURL') 8soup = BeautifulSoup(html.content,'html.parser') 9 10url_list = ['口コミページのURL', 11 '***'] 12 13valuer = [] 14for row in url_list: 15 row = str(row) 16 html = urllib.request.urlopen(row) 17 soup = BeautifulSoup(html) 18 valuer.append(soup.find_all("span", class_='jlnpc-kuchikomi__cassette__user__name')) 19 continue 20valuer_list = valuer[0]+valuer[1]+valuer[2] 21new_valuer_list = [] 22for row in valuer_list: 23 row = str(row) 24 new_valuer_list.append(row.split('(',1).split(')',0)) 25 26data = pd.DataFrame() 27sex = [] 28age = [] 29for row in new_valuer_list: 30 row = str(row) 31 sex.append(row.split(' / ')[0]) 32 age.append(row.split(' / ')[1]) 33new_age = [] 34for row in age: 35 row = str(row) 36 new_age.append(row.replace("代","'s")) 37data['sex'] = sex 38data['age'] = new_age 39 40value = [] 41for row in url_list: 42 row = str(row) 43 html = urllib.request.urlopen(row) 44 soup = BeautifulSoup(html) 45 value.append(soup.find_all("span", class_='jlnpc-kuchikomi__cassette__rating__em')) 46 continue 47value = value[0]+value[1]+value[2] 48new_value = [] 49for row in value: 50 row = str(row) 51 new_value.append(row.split('')[1].split('')[0]) 52data['value'] = new_value 53 54data['sex'].value_counts() 55 56sns.countplot('sex', data = data)

試したこと

URLに問題があることを疑いましたが、別のURLで試しても同じエラーが出ました。

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

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

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

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

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

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

y_waiwai

2022/01/08 07:26

どこの行でそのエラーが出るんでしょうか
hunimojiko

2022/01/08 07:34

分かりにくい箇所があり失礼しました。 「該当のソースコード」の一番最後、 sns.countplot('sex', data = data) で、 ValueError: min() arg is an empty sequence が出ます。 質問の方も修正しました。
melian

2022/01/08 08:04

valuer.append(soup.find_all("span", class_='jlnpc-kuchikomi__cassette__user__name')) としている箇所がありますが、おそらく、class名に jlnpc-kuchikomi__cassette__user__name を持つ span タグが無いのだと思います。スクレイピング対象の URL の HTML コードを確認してみて下さい。
guest

回答1

0

ベストアンサー

python

1from bs4 import BeautifulSoup 2import urllib 3import pandas as pd 4import requests 5import seaborn as sns 6from matplotlib import pyplot as plt 7import re 8 9plt.rcParams['font.family'] = 'MS Gothic' 10pd.set_option('display.unicode.east_asian_width', True) 11 12url_list = [ 13 'https://www.jalan.net/kankou/spt_25203cc3360049331/kuchikomi/?screenId=OUW2201', 14] 15 16valuer, rating, ws, comment = [], [], [], [] 17for row in url_list: 18 html = urllib.request.urlopen(row) 19 soup = BeautifulSoup(html) 20 # 性別・年齢 21 valuer.extend(soup.find_all('div', class_='item-user')) 22 # レーティング 23 rating.extend(soup.select('div[class="item-info"] > div > span[class="reviewPoint"]')) 24 # 行った時期(年月のみ)、滞在時間 25 ws.extend(soup.select('ul[class="item-reviewDetail"]')) 26 # コメント 27 comment.extend(soup.select('div[class="item-info"] > div[class="item-reviewText"]')) 28 29# 性別・年齢 30gender, age = [], [] 31for v in valuer: 32 m = re.search(r'([男女]性)\s*[//]\s*(.+?)\s*代', v.get_text().strip()) 33 if m: 34 gender.append(m[1]) 35 age.append(m[2] + "'s") 36 37# レーティング 38rating = [float(d.get_text()) for d in rating] 39 40# 行った時期(年月のみ)、滞在時間 41went, stay = [], [] 42for i in ws: 43 t = i.get_text() 44 went.append( 45 re.search(r'行った時期:\s*(\d+年\d+月)', t)[1] 46 if '行った時期:' in t else '') 47 stay.append( 48 re.search(r'滞在時間:(.+?)\s*\n', t)[1] 49 if '滞在時間:' in t else '') 50 51# コメント 52comment = [c.get_text().strip() for c in comment] 53 54# create a Pandas dataframe 55data = pd.DataFrame({ 56 '性別': gender, '年齢': age, 'レーティング': rating, 57 '行った時期': went, '滞在時間': stay, 'コメント': comment 58}) 59 60print(data.to_markdown(index=False)) 61 62#print(data['性別'].value_counts()) 63#print(data['年齢'].value_counts()) 64#print(data['レーティング'].value_counts()) 65 66#sns.countplot('性別', data=data) 67#sns.countplot('年齢', data=data, order=data['年齢'].sort_values().unique()) 68#sns.countplot('レーティング', data=data)
性別年齢rating行った時期滞在時間コメント
女性60's42020年11月1〜2時間お土産屋さんがいっぱいあって目移りしてし ...
女性40's42021年12月下町散歩はとても楽しかったです。ガラス館 ...
女性20's42021年9月今回は恋人と訪れました。名前の通り黒壁! ...
女性50's32021年11月1〜2時間ガラス館を中心にスイーツを食べ歩きして来 ...
女性40's42020年11月1〜2時間のんびり歩くには丁度よい町で、美味しいお ...
女性50's42021年8月1時間未満改装されていましたが、以前とあまり変わっ ...
男性60's32021年8月あいにくの雨模様でしたが人手が多く人気が ...
女性50's42021年8月1〜2時間人は結構いました。半年前にも訪問してその ...
女性50's42021年7月昔ながらの建物が残っている。とても 貴重 ...
女性40's32021年8月1時間未満暑いので店内に入れるお店でランチを済ませ ...

投稿2022/01/08 09:20

編集2022/01/08 12:54
melian

総合スコア20655

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

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

hunimojiko

2022/01/08 09:40

回答ありがとうございます。コードと結果まで載せていただいて、大変助かります。おかげで理解できました。 ただ、再度の質問で申し訳ありませんが、今回スクレイピングしようとしている「じゃらん」のサイトは少し仕様が異なり、取得したいデータを含む〈span〉タグにクラス名がついていない場合、例えば、 <p class="item-name iconMedal-regular"> <a href="https://www.jalan.net/user/FBB0016158EHI/mypage/">雪だるまさん</a> <span>女性/40代</span> </p> の中の「女性」「40代」というデータを同じように取得することはできますか?
melian

2022/01/08 09:57 編集

valuer.extend(soup.find_all('span', class_='c-label')) を valuer.extend(soup.find_all('p', class_='item-name iconMedal-regular')) に変更、 m = re.match(r'([男女]性)\s*/\s*(.+)\s*代', v.get_text().strip()) を m = re.match(r'([男女]性)\s*[//]\s*(.+)\s*代', v.get_text().strip()) に変更すれば上手く行くかもしれません。具体的な URL を教えていただければこちらでも動作確認をすることができます。
melian

2022/01/08 10:31

回答のコードを修正しましたので確認してみて下さい。
hunimojiko

2022/01/08 11:42 編集

ありがとうございます。データを取り出すことができました。 先にに言うべきでしたが、今回、この他に「行った時期(年月のみ)」「滞在時間」「誰と(友達同士かどうかなど)」「コメント」を取り出そうと思っておりますが、苦戦しております。卒論でpythonを扱うようになったため、勉強不足かつ何度も恐縮ですがご教授願います。よろしくお願いいたします。
melian

2022/01/08 12:57

「誰と(友達同士かどうかなど)」はどこを見ればよいのか判りませんでした。「滞在時間」は記載のない人がいるので、その場合は空欄にしています。
hunimojiko

2022/01/08 13:30

何度も答えていただきありがとうございます。大変助かりました。「誰と」は必ずしも必要ではないので余裕があれば自分でやってみようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問