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

回答編集履歴

1

テキスト修正

2019/04/30 03:29

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -70,4 +70,48 @@
70
70
  $
71
71
 
72
72
 
73
- 参考になれば幸いです。
73
+ 参考になれば幸いです。
74
+
75
+
76
+ ### 追記
77
+
78
+ コメントから頂きました、以下
79
+
80
+ > 最終的には class=item のブロック毎に class="bold",class="name" を抜き出したいのですが、頂いたコードをマージしたら、desc の内容(50件)が毎回が出力されてしまいました。item単位で出力する方法はありますでしょうか?
81
+
82
+
83
+ を満たすコードを検討しました。質問者様の要件を過不足無く満たしているかは確信を持てませんが、以下ではどうでしょうか?
84
+
85
+ ```python3
86
+ from bs4 import BeautifulSoup
87
+
88
+ html = open('input.html', 'r').read()
89
+
90
+ soup = BeautifulSoup(html, 'lxml')
91
+
92
+ for i, item in enumerate(soup.select('.item')):
93
+
94
+ print("-- %d 番目の item: --" % (i+1))
95
+
96
+ for clazz in ['desc', 'bold', 'name']:
97
+ elm = item.select_one('.' + clazz)
98
+ set_span = elm.select_one('.set')
99
+
100
+ if set_span:
101
+ print("%s: [%s]%s" % (clazz, set_span.text, set_span.next_sibling))
102
+ else:
103
+ print("%s: %s" % (clazz, elm.text))
104
+ ```
105
+
106
+ `input.html` は先の回答に挙げたもののままで、上記を実行すると、以下のように出力されます。
107
+
108
+ > $ python test.py
109
+ **-- 1 番目の item: --**
110
+ **desc: [SET]アイテム1**
111
+ **bold: 1**
112
+ **name: A**
113
+ **-- 2 番目の item: --**
114
+ **desc: アイテム2**
115
+ **bold: 2**
116
+ **name: B**
117
+ $