回答編集履歴

1

テキスト修正

2019/04/30 03:29

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -143,3 +143,91 @@
143
143
 
144
144
 
145
145
  参考になれば幸いです。
146
+
147
+
148
+
149
+
150
+
151
+ ### 追記
152
+
153
+
154
+
155
+ コメントから頂きました、以下
156
+
157
+
158
+
159
+ > 最終的には class=item のブロック毎に class="bold",class="name" を抜き出したいのですが、頂いたコードをマージしたら、desc の内容(50件)が毎回が出力されてしまいました。item単位で出力する方法はありますでしょうか?
160
+
161
+
162
+
163
+
164
+
165
+ を満たすコードを検討しました。質問者様の要件を過不足無く満たしているかは確信を持てませんが、以下ではどうでしょうか?
166
+
167
+
168
+
169
+ ```python3
170
+
171
+ from bs4 import BeautifulSoup
172
+
173
+
174
+
175
+ html = open('input.html', 'r').read()
176
+
177
+
178
+
179
+ soup = BeautifulSoup(html, 'lxml')
180
+
181
+
182
+
183
+ for i, item in enumerate(soup.select('.item')):
184
+
185
+
186
+
187
+ print("-- %d 番目の item: --" % (i+1))
188
+
189
+
190
+
191
+ for clazz in ['desc', 'bold', 'name']:
192
+
193
+ elm = item.select_one('.' + clazz)
194
+
195
+ set_span = elm.select_one('.set')
196
+
197
+
198
+
199
+ if set_span:
200
+
201
+ print("%s: [%s]%s" % (clazz, set_span.text, set_span.next_sibling))
202
+
203
+ else:
204
+
205
+ print("%s: %s" % (clazz, elm.text))
206
+
207
+ ```
208
+
209
+
210
+
211
+ `input.html` は先の回答に挙げたもののままで、上記を実行すると、以下のように出力されます。
212
+
213
+
214
+
215
+ > $ python test.py
216
+
217
+ **-- 1 番目の item: --**
218
+
219
+ **desc: [SET]アイテム1**
220
+
221
+ **bold: 1**
222
+
223
+ **name: A**
224
+
225
+ **-- 2 番目の item: --**
226
+
227
+ **desc: アイテム2**
228
+
229
+ **bold: 2**
230
+
231
+ **name: B**
232
+
233
+ $