回答編集履歴

2

update

2022/01/08 12:54

投稿

melian
melian

スコア20655

test CHANGED
@@ -18,17 +18,19 @@
18
18
 
19
19
  plt.rcParams['font.family'] = 'MS Gothic'
20
20
 
21
+ pd.set_option('display.unicode.east_asian_width', True)
22
+
21
23
 
22
24
 
23
25
  url_list = [
24
26
 
25
- 'https://www.jalan.net/kankou/spt_25203cc3360049331/kuchikomi/?screenId=OUW2201'
27
+ 'https://www.jalan.net/kankou/spt_25203cc3360049331/kuchikomi/?screenId=OUW2201',
26
28
 
27
29
  ]
28
30
 
29
31
 
30
32
 
31
- valuer, rating = [], []
33
+ valuer, rating, ws, comment = [], [], [], []
32
34
 
33
35
  for row in url_list:
34
36
 
@@ -36,11 +38,25 @@
36
38
 
37
39
  soup = BeautifulSoup(html)
38
40
 
41
+ # 性別・年齢
42
+
39
43
  valuer.extend(soup.find_all('div', class_='item-user'))
44
+
45
+ # レーティング
40
46
 
41
47
  rating.extend(soup.select('div[class="item-info"] > div > span[class="reviewPoint"]'))
42
48
 
49
+ # 行った時期(年月のみ)、滞在時間
43
50
 
51
+ ws.extend(soup.select('ul[class="item-reviewDetail"]'))
52
+
53
+ # コメント
54
+
55
+ comment.extend(soup.select('div[class="item-info"] > div[class="item-reviewText"]'))
56
+
57
+
58
+
59
+ # 性別・年齢
44
60
 
45
61
  gender, age = [], []
46
62
 
@@ -56,19 +72,61 @@
56
72
 
57
73
 
58
74
 
75
+ # レーティング
76
+
59
77
  rating = [float(d.get_text()) for d in rating]
60
78
 
61
79
 
62
80
 
81
+ # 行った時期(年月のみ)、滞在時間
82
+
83
+ went, stay = [], []
84
+
85
+ for i in ws:
86
+
87
+ t = i.get_text()
88
+
89
+ went.append(
90
+
91
+ re.search(r'行った時期:\s*(\d+年\d+月)', t)[1]
92
+
63
- data = pd.DataFrame({'性別': gender, '年齢': age, 'レーティング': rating})
93
+ if '行った時期:' in t else '')
94
+
95
+ stay.append(
96
+
97
+ re.search(r'滞在時間:(.+?)\s*\n', t)[1]
98
+
99
+ if '滞在時間:' in t else '')
64
100
 
65
101
 
66
102
 
67
- print(data['性別'].value_counts())
103
+ # コメント
68
104
 
69
- print(data['年齢'].value_counts())
105
+ comment = [c.get_text().strip() for c in comment]
70
106
 
107
+
108
+
109
+ # create a Pandas dataframe
110
+
111
+ data = pd.DataFrame({
112
+
113
+ '性別': gender, '年齢': age, 'レーティング': rating,
114
+
115
+ '行った時期': went, '滞在時間': stay, 'コメント': comment
116
+
117
+ })
118
+
119
+
120
+
121
+ print(data.to_markdown(index=False))
122
+
123
+
124
+
125
+ #print(data['性別'].value_counts())
126
+
127
+ #print(data['年齢'].value_counts())
128
+
71
- print(data['レーティング'].value_counts())
129
+ #print(data['レーティング'].value_counts())
72
130
 
73
131
 
74
132
 
@@ -78,42 +136,30 @@
78
136
 
79
137
  #sns.countplot('レーティング', data=data)
80
138
 
81
-
82
-
83
- #
84
-
85
- 女性 46
139
+ ```
86
-
87
- 男性 44
88
-
89
- Name: 性別, dtype: int64
90
140
 
91
141
 
92
142
 
93
- 60's 25
143
+ | 性別 | 年齢 | rating | 行った時期 | 滞在時間 | コメント |
94
144
 
95
- 50's 24
145
+ |:------:|:------:|---:|:-------------|:----------:|:---------------------------------------------|
96
146
 
97
- 40's 21
147
+ | 女性 | 60's | 4 | 2020年11月 | 1〜2時間 | お土産屋さんがいっぱいあって目移りしてし ... |
98
148
 
99
- 30's 9
149
+ | 女性 | 40's | 4 | 2021年12月 | | 下町散歩はとても楽しかったです。ガラス館 ... |
100
150
 
101
- 20's 6
151
+ | 女性 | 20's | 4 | 2021年9月 | | 今回は恋人と訪れました。名前の通り黒壁! ... |
102
152
 
103
- 70's 4
153
+ | 女性 | 50's | 3 | 2021年11月 | 1〜2時間 | ガラス館を中心にスイーツを食べ歩きして来 ... |
104
154
 
105
- 80's 1
155
+ | 女性 | 40's | 4 | 2020年11月 | 1〜2時間 | のんびり歩くには丁度よい町で、美味しいお ... |
106
156
 
107
- Name:齢, dtype: int64
157
+ | 女性 | 50's | 4 | 20218月 | 1時間未満 | 改装されていましたが、以前とあまり変わっ ... |
108
158
 
159
+ | 男性 | 60's | 3 | 2021年8月 | | あいにくの雨模様でしたが人手が多く人気が ... |
109
160
 
161
+ | 女性 | 50's | 4 | 2021年8月 | 1〜2時間 | 人は結構いました。半年前にも訪問してその ... |
110
162
 
111
- 5 61
163
+ | 女性 | 50's | 4 | 2021年7月 | | 昔ながらの建物が残っている。とても 貴重 ... |
112
164
 
113
- 4 25
114
-
115
- 3 4
116
-
117
- Name: レーティグ, dtype: int64
165
+ | 女性 | 40's | 3 | 2021年8月 | 1時間未満 | 暑いので店内に入れるお店でラチを済ませ ... |
118
-
119
- ```

1

Update

2022/01/08 12:54

投稿

melian
melian

スコア20655

test CHANGED
@@ -1,11 +1,3 @@
1
- > コードはhttps://www.acceluniverse.com/blog/developers/2020/01/post-36.htmlから拝借しました。
2
-
3
-
4
-
5
- その記事に書かれている `url_list` で試してみましたが、抽出する `HTML` 要素の `class` 名が異なっている様です。
6
-
7
-
8
-
9
1
  ```python
10
2
 
11
3
  from bs4 import BeautifulSoup
@@ -30,11 +22,7 @@
30
22
 
31
23
  url_list = [
32
24
 
33
- 'https://www.jalan.net/yad309590/kuchikomi/?screenId=UWW3701&idx=0&smlCd=060203&dateUndecided=1&yadNo=309590&distCd=01',
25
+ 'https://www.jalan.net/kankou/spt_25203cc3360049331/kuchikomi/?screenId=OUW2201'
34
-
35
- 'https://www.jalan.net/yad309590/kuchikomi/2.HTML?screenId=UWW3701&idx=30&smlCd=060203&dateUndecided=1&yadNo=309590&distCd=01',
36
-
37
- 'https://www.jalan.net/yad309590/kuchikomi/3.HTML?screenId=UWW3701&idx=60&smlCd=060203&dateUndecided=1&yadNo=309590&distCd=01'
38
26
 
39
27
  ]
40
28
 
@@ -48,9 +36,9 @@
48
36
 
49
37
  soup = BeautifulSoup(html)
50
38
 
51
- valuer.extend(soup.find_all('span', class_='c-label'))
39
+ valuer.extend(soup.find_all('div', class_='item-user'))
52
40
 
53
- rating.extend(soup.find_all('div', class_='jlnpc-kuchikomiCassette__totalRate'))
41
+ rating.extend(soup.select('div[class="item-info"] > div > span[class="reviewPoint"]'))
54
42
 
55
43
 
56
44
 
@@ -58,7 +46,7 @@
58
46
 
59
47
  for v in valuer:
60
48
 
61
- m = re.match(r'([男女]性)\s*/\s*(.+)\s*代', v.get_text().strip())
49
+ m = re.search(r'([男女]性)\s*[//]\s*(.+?)\s*代', v.get_text().strip())
62
50
 
63
51
  if m:
64
52
 
@@ -68,7 +56,7 @@
68
56
 
69
57
 
70
58
 
71
- rating = [int(d.get_text()) for d in rating]
59
+ rating = [float(d.get_text()) for d in rating]
72
60
 
73
61
 
74
62
 
@@ -129,11 +117,3 @@
129
117
  Name: レーティング, dtype: int64
130
118
 
131
119
  ```
132
-
133
-
134
-
135
- ![性別](a1bbc07dc38dd12932748b8756de36c5.png)
136
-
137
- ![年齢](fdd064a8acb714e6fb454bf51b72ff5a.png)
138
-
139
- ![レーティング](a70b532b42e15e59e29b81052368cf9c.png)