質問編集履歴

3

追記を追加

2019/09/08 19:45

投稿

tyobit
tyobit

スコア17

test CHANGED
File without changes
test CHANGED
@@ -70,7 +70,7 @@
70
70
 
71
71
  <i>→<b>の場合
72
72
 
73
- [2][1]あいうえお[/1][2]
73
+ [2][1]あいうえお[/1][/2]
74
74
 
75
75
  ```
76
76
 
@@ -155,3 +155,43 @@
155
155
  この場合、2周目のcontentsのクラスがbs4.element.Tagのためfind_allが使えなかった
156
156
 
157
157
  また、find_allだと"<b><i>あいうえお</i></b>"に対して、[<b><i>あいうえお</i></b>,<i>あいうえお</i>]と同一のテキストを複数回抽出してしまう
158
+
159
+
160
+
161
+ 追記3--
162
+
163
+ ```python
164
+
165
+ while 1: #子要素がなくなるまでひたすら繰り返す
166
+
167
+ j=0 #ループ抜け用
168
+
169
+ for tag in tag_list: #スコア対象のタグについて一つずつ確認
170
+
171
+ for contents in soup.find_all(tag):
172
+
173
+ i=0 #子要素があるか確認
174
+
175
+ for content in contents.contents:
176
+
177
+ if content.name != None:
178
+
179
+ i+=1
180
+
181
+ j+=1
182
+
183
+ if i==0: #子要素がなかったら該当スコアをタグ形式で付与
184
+
185
+            #タグごとのスコア決めは省略
186
+
187
+ contents.string = start + contents.string + end
188
+
189
+ contents.unwrap() #スコアを付与したらタグを外す
190
+
191
+ if j==0: break
192
+
193
+ ```
194
+
195
+ これによって"<b><i>あいうえお</i></b>"に対して"[2][1]あいうえお[/1][/2]"と出力できるようになった
196
+
197
+ 次は"[2][1]あいうえお[/1][/2]"を"[3]あいうえお[/3]"とまとめたい

2

追記を追加

2019/09/08 19:45

投稿

tyobit
tyobit

スコア17

test CHANGED
File without changes
test CHANGED
@@ -99,3 +99,59 @@
99
99
  ```
100
100
 
101
101
  としてみたが結果は同じだった
102
+
103
+
104
+
105
+ 追記2--
106
+
107
+ ```python
108
+
109
+ def list_check(f,L,tag): #listでなかったら関数に投げる
110
+
111
+ if isinstance(L,list):
112
+
113
+ if L == []:
114
+
115
+ return []
116
+
117
+ else:
118
+
119
+ return [list_check(f,L[0],tag)] + list_check(f,L[1:],tag)
120
+
121
+ else:
122
+
123
+ return f(L,tag)
124
+
125
+
126
+
127
+ def contents_check(contents,tag): #
128
+
129
+ for contents_list in contents.find_all(tag): #スコア対象のタグ一覧から該当するものを探す
130
+
131
+ tag_num=0
132
+
133
+ for content in contents_list.contents: #子の要素にタグがあるか確認
134
+
135
+ if content.name != None:
136
+
137
+ tag_num = 1
138
+
139
+ if tag_num == 0: #子にタグがなかったら(入れ子の一番内側)
140
+
141
+ """
142
+
143
+ タグごとのスコア決めは省略
144
+
145
+ """
146
+
147
+ contents_list.replace_with(start + contents_list.string + end) #点数で挟む[1]~~~[/1]など
148
+
149
+ else:
150
+
151
+ list_check(contents_check,contents_list.contents,tag) #子の要素にタグがある場合、もう一周
152
+
153
+ ```
154
+
155
+ この場合、2周目のcontentsのクラスがbs4.element.Tagのためfind_allが使えなかった
156
+
157
+ また、find_allだと"<b><i>あいうえお</i></b>"に対して、[<b><i>あいうえお</i></b>,<i>あいうえお</i>]と同一のテキストを複数回抽出してしまう

1

追記を追加

2019/09/08 18:38

投稿

tyobit
tyobit

スコア17

test CHANGED
File without changes
test CHANGED
@@ -81,3 +81,21 @@
81
81
  新しい方法が見つかり次第、質問内容を更新していきます。
82
82
 
83
83
  アドバイスのほどよろしくお願いします。
84
+
85
+
86
+
87
+ 追記--
88
+
89
+ ```python
90
+
91
+ find = soup.find_all(tag)
92
+
93
+ for text in find:
94
+
95
+ text.string = start + text.string + end
96
+
97
+ #startとendはタグの種類によって変わる
98
+
99
+ ```
100
+
101
+ としてみたが結果は同じだった