teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

update

2022/01/08 12:54

投稿

melian
melian

スコア21265

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

1

Update

2022/01/08 12:54

投稿

melian
melian

スコア21265

answer CHANGED
@@ -1,7 +1,3 @@
1
- > コードはhttps://www.acceluniverse.com/blog/developers/2020/01/post-36.htmlから拝借しました。
2
-
3
- その記事に書かれている `url_list` で試してみましたが、抽出する `HTML` 要素の `class` 名が異なっている様です。
4
-
5
1
  ```python
6
2
  from bs4 import BeautifulSoup
7
3
  import urllib
@@ -14,26 +10,24 @@
14
10
  plt.rcParams['font.family'] = 'MS Gothic'
15
11
 
16
12
  url_list = [
17
- 'https://www.jalan.net/yad309590/kuchikomi/?screenId=UWW3701&idx=0&smlCd=060203&dateUndecided=1&yadNo=309590&distCd=01',
13
+ 'https://www.jalan.net/kankou/spt_25203cc3360049331/kuchikomi/?screenId=OUW2201'
18
- 'https://www.jalan.net/yad309590/kuchikomi/2.HTML?screenId=UWW3701&idx=30&smlCd=060203&dateUndecided=1&yadNo=309590&distCd=01',
19
- 'https://www.jalan.net/yad309590/kuchikomi/3.HTML?screenId=UWW3701&idx=60&smlCd=060203&dateUndecided=1&yadNo=309590&distCd=01'
20
14
  ]
21
15
 
22
16
  valuer, rating = [], []
23
17
  for row in url_list:
24
18
  html = urllib.request.urlopen(row)
25
19
  soup = BeautifulSoup(html)
26
- valuer.extend(soup.find_all('span', class_='c-label'))
20
+ valuer.extend(soup.find_all('div', class_='item-user'))
27
- rating.extend(soup.find_all('div', class_='jlnpc-kuchikomiCassette__totalRate'))
21
+ rating.extend(soup.select('div[class="item-info"] > div > span[class="reviewPoint"]'))
28
22
 
29
23
  gender, age = [], []
30
24
  for v in valuer:
31
- m = re.match(r'([男女]性)\s*/\s*(.+)\s*代', v.get_text().strip())
25
+ m = re.search(r'([男女]性)\s*[//]\s*(.+?)\s*代', v.get_text().strip())
32
26
  if m:
33
27
  gender.append(m[1])
34
28
  age.append(m[2] + "'s")
35
29
 
36
- rating = [int(d.get_text()) for d in rating]
30
+ rating = [float(d.get_text()) for d in rating]
37
31
 
38
32
  data = pd.DataFrame({'性別': gender, '年齢': age, 'レーティング': rating})
39
33
 
@@ -63,8 +57,4 @@
63
57
  4 25
64
58
  3 4
65
59
  Name: レーティング, dtype: int64
66
- ```
60
+ ```
67
-
68
- ![性別](a1bbc07dc38dd12932748b8756de36c5.png)
69
- ![年齢](fdd064a8acb714e6fb454bf51b72ff5a.png)
70
- ![レーティング](a70b532b42e15e59e29b81052368cf9c.png)