質問編集履歴

7

微修正

2016/05/29 12:44

投稿

horik
horik

スコア44

test CHANGED
File without changes
test CHANGED
@@ -72,7 +72,9 @@
72
72
 
73
73
 
74
74
 
75
- --
75
+ ---------
76
+
77
+
76
78
 
77
79
  attakeiさん回答ありがとうございます。
78
80
 

6

返信

2016/05/29 12:44

投稿

horik
horik

スコア44

test CHANGED
File without changes
test CHANGED
@@ -1,3 +1,79 @@
1
+ attakeiさん再び回答ありがとうございます。
2
+
3
+ だいぶスッキリとコードが書けるようになりました。
4
+
5
+
6
+
7
+ addressのdictのkeyの部分;
8
+
9
+ address.append({li.attrs.get('class')[0]: li.text})
10
+
11
+
12
+
13
+ はもっと綺麗に書く方法はないでしょうか?
14
+
15
+ liのclassを取得したいだけなのに
16
+
17
+ attrs.get('class')[0]
18
+
19
+ こういうのしか思い当たりませんでした。
20
+
21
+
22
+
23
+ これが最善であれば、このままベストアンサーにさせていただきます。
24
+
25
+
26
+
27
+ ```python
28
+
29
+ profile = []
30
+
31
+ soup = BeautifulSoup(html, "html.parser")
32
+
33
+
34
+
35
+ for div in soup.select(".profile"):
36
+
37
+ name = div.h3.text
38
+
39
+ hobby = []
40
+
41
+ address = []
42
+
43
+ for a in div.select('ul.hobby > li > a'):
44
+
45
+ hobby.append(a.text)
46
+
47
+ for li in div.select('ul.address > li'):
48
+
49
+ address.append({li.attrs.get('class')[0]: li.text})
50
+
51
+ profile.append({"name": name, "hobby": hobby, "address": address})
52
+
53
+
54
+
55
+ print(profile)
56
+
57
+ ```
58
+
59
+
60
+
61
+ ```python
62
+
63
+ [
64
+
65
+ {'name': '山田太郎', 'hobby': ['サッカー', 'ドライブ'], 'address': [{'city': '東京都'}, {'ward': '新宿区'}, {'town': '西新宿'}]},
66
+
67
+ {'name': '鈴木花子', 'hobby': ['手芸', '料理', '旅行'], 'address': [{'city': '大阪市'}, {'ward': '中央区'}]}
68
+
69
+ ]
70
+
71
+ ```
72
+
73
+
74
+
75
+ --
76
+
1
77
  attakeiさん回答ありがとうございます。
2
78
 
3
79
  追加で質問させてください。

5

勘違いがあったので修正

2016/05/29 12:42

投稿

horik
horik

スコア44

test CHANGED
File without changes
test CHANGED
@@ -1,4 +1,4 @@
1
- argiusさん回答ありがとうございます。
1
+ attakeiさん回答ありがとうございます。
2
2
 
3
3
  追加で質問させてください。
4
4
 

4

微修正

2016/05/27 16:32

投稿

horik
horik

スコア44

test CHANGED
File without changes
test CHANGED
@@ -31,8 +31,6 @@
31
31
  ---------------------------
32
32
 
33
33
  html = """
34
-
35
- <div>
36
34
 
37
35
  <div class="profile">
38
36
 
@@ -81,8 +79,6 @@
81
79
  </ul>
82
80
 
83
81
  </div>
84
-
85
- <dib>
86
82
 
87
83
  """
88
84
 

3

追加の質問

2016/05/27 16:23

投稿

horik
horik

スコア44

test CHANGED
File without changes
test CHANGED
@@ -1,3 +1,119 @@
1
+ argiusさん回答ありがとうございます。
2
+
3
+ 追加で質問させてください。
4
+
5
+
6
+
7
+ ul要素が複数あった場合、最初の要素は取れましたが、
8
+
9
+ 二つ目以降の取り方がわかりませんでした。
10
+
11
+
12
+
13
+ 下のコードで取れたデータ:
14
+
15
+ [{'name': '山田太郎', 'hobby': ['サッカー', 'ドライブ']},
16
+
17
+ {'name': '鈴木花子', 'hobby': ['手芸', '料理', '旅行']}]
18
+
19
+
20
+
21
+ 期待する出力は:
22
+
23
+ [{'name': '山田太郎', 'hobby': ['サッカー', 'ドライブ'], 'address': [{'city': "東京都"}, {'ward': "新宿区"}, {'town': "西新宿"}]},
24
+
25
+ {'name': '鈴木花子', 'hobby': ['手芸', '料理', '旅行'], 'address': [{'city': "大阪市',}, {'ward': '中央区'}]}]
26
+
27
+
28
+
29
+
30
+
31
+ ---------------------------
32
+
33
+ html = """
34
+
35
+ <div>
36
+
37
+ <div class="profile">
38
+
39
+ <h3>山田太郎</h3>
40
+
41
+ <ul class="hobby">
42
+
43
+ <li><a href="#">サッカー</a></li>
44
+
45
+ <li><a href="#">ドライブ</a></li>
46
+
47
+ </ul>
48
+
49
+ <ul class="address">
50
+
51
+ <li class="city">東京都</li>
52
+
53
+ <li class="ward">新宿区</li>
54
+
55
+ <li class="town">西新宿</li>
56
+
57
+ </ul>
58
+
59
+ </div>
60
+
61
+ <div class="profile">
62
+
63
+ <h3>鈴木花子</h3>
64
+
65
+ <ul class="hobby">
66
+
67
+ <li><a href="#">手芸</a></li>
68
+
69
+ <li><a href="#">料理</a></li>
70
+
71
+ <li><a href="#">旅行</a></li>
72
+
73
+ </ul>
74
+
75
+ <ul class="address">
76
+
77
+ <li class="city">大阪市</li>
78
+
79
+ <li class="ward">中央区</li>
80
+
81
+ </ul>
82
+
83
+ </div>
84
+
85
+ <dib>
86
+
87
+ """
88
+
89
+ profile = []
90
+
91
+ soup = BeautifulSoup(html, "html.parser")
92
+
93
+ for div in soup.select(".profile"):
94
+
95
+ name = div.h3.text
96
+
97
+ hobby = []
98
+
99
+ for a in div.ul.findChildren("a"):
100
+
101
+ hobby.append(a.text)
102
+
103
+ profile.append({"name": name, "hobby": hobby})
104
+
105
+ print(profile)
106
+
107
+
108
+
109
+
110
+
111
+
112
+
113
+
114
+
115
+ ==============前回の質問==============
116
+
1
117
  例えば下のようなHTMLがあっとして、二人のプロフィールを次のようなjson形式で保存したいと考えています。
2
118
 
3
119
  {[name: "山田太郎", comment: "よろしくお願いします", age: 26, address: "東京都"], [name: "鈴木花子", comment: "よろしくお願いします", age: 20, address: "大阪府"]}

2

コードの修正

2016/05/27 16:22

投稿

horik
horik

スコア44

test CHANGED
File without changes
test CHANGED
@@ -48,7 +48,7 @@
48
48
 
49
49
  試したこと:
50
50
 
51
- for name = in soup.select(".profile > h3")
51
+ for name in soup.select(".profile > h3")
52
52
 
53
53
  print(name.text)
54
54
 

1

微修正

2016/05/26 14:23

投稿

horik
horik

スコア44

test CHANGED
File without changes
test CHANGED
@@ -54,7 +54,7 @@
54
54
 
55
55
  こうすると山田太郎と山田花子の名前を取れますが、
56
56
 
57
- あとの年齢、職業、都道府県を名前と紐付けた形で取得できません。
57
+ あとの年齢、都道府県を名前と紐付けた形で取得できません。
58
58
 
59
59
 
60
60