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

質問編集履歴

3

追記を追加

2019/09/08 19:45

投稿

tyobit
tyobit

スコア17

title CHANGED
File without changes
body CHANGED
@@ -34,7 +34,7 @@
34
34
  <b>→<i>の場合
35
35
  [2]あいうえお[/2]
36
36
  <i>→<b>の場合
37
- [2][1]あいうえお[/1][2]
37
+ [2][1]あいうえお[/1][/2]
38
38
  ```
39
39
 
40
40
  現在、解決方法を探し始めた状態での質問になります。
@@ -76,4 +76,24 @@
76
76
  list_check(contents_check,contents_list.contents,tag) #子の要素にタグがある場合、もう一周
77
77
  ```
78
78
  この場合、2周目のcontentsのクラスがbs4.element.Tagのためfind_allが使えなかった
79
- また、find_allだと"<b><i>あいうえお</i></b>"に対して、[<b><i>あいうえお</i></b>,<i>あいうえお</i>]と同一のテキストを複数回抽出してしまう
79
+ また、find_allだと"<b><i>あいうえお</i></b>"に対して、[<b><i>あいうえお</i></b>,<i>あいうえお</i>]と同一のテキストを複数回抽出してしまう
80
+
81
+ 追記3--
82
+ ```python
83
+ while 1: #子要素がなくなるまでひたすら繰り返す
84
+ j=0 #ループ抜け用
85
+ for tag in tag_list: #スコア対象のタグについて一つずつ確認
86
+ for contents in soup.find_all(tag):
87
+ i=0 #子要素があるか確認
88
+ for content in contents.contents:
89
+ if content.name != None:
90
+ i+=1
91
+ j+=1
92
+ if i==0: #子要素がなかったら該当スコアをタグ形式で付与
93
+            #タグごとのスコア決めは省略
94
+ contents.string = start + contents.string + end
95
+ contents.unwrap() #スコアを付与したらタグを外す
96
+ if j==0: break
97
+ ```
98
+ これによって"<b><i>あいうえお</i></b>"に対して"[2][1]あいうえお[/1][/2]"と出力できるようになった
99
+ 次は"[2][1]あいうえお[/1][/2]"を"[3]あいうえお[/3]"とまとめたい

2

追記を追加

2019/09/08 19:45

投稿

tyobit
tyobit

スコア17

title CHANGED
File without changes
body CHANGED
@@ -48,4 +48,32 @@
48
48
  text.string = start + text.string + end
49
49
  #startとendはタグの種類によって変わる
50
50
  ```
51
- としてみたが結果は同じだった
51
+ としてみたが結果は同じだった
52
+
53
+ 追記2--
54
+ ```python
55
+ def list_check(f,L,tag): #listでなかったら関数に投げる
56
+ if isinstance(L,list):
57
+ if L == []:
58
+ return []
59
+ else:
60
+ return [list_check(f,L[0],tag)] + list_check(f,L[1:],tag)
61
+ else:
62
+ return f(L,tag)
63
+
64
+ def contents_check(contents,tag): #
65
+ for contents_list in contents.find_all(tag): #スコア対象のタグ一覧から該当するものを探す
66
+ tag_num=0
67
+ for content in contents_list.contents: #子の要素にタグがあるか確認
68
+ if content.name != None:
69
+ tag_num = 1
70
+ if tag_num == 0: #子にタグがなかったら(入れ子の一番内側)
71
+ """
72
+ タグごとのスコア決めは省略
73
+ """
74
+ contents_list.replace_with(start + contents_list.string + end) #点数で挟む[1]~~~[/1]など
75
+ else:
76
+ list_check(contents_check,contents_list.contents,tag) #子の要素にタグがある場合、もう一周
77
+ ```
78
+ この場合、2周目のcontentsのクラスがbs4.element.Tagのためfind_allが使えなかった
79
+ また、find_allだと"<b><i>あいうえお</i></b>"に対して、[<b><i>あいうえお</i></b>,<i>あいうえお</i>]と同一のテキストを複数回抽出してしまう

1

追記を追加

2019/09/08 18:38

投稿

tyobit
tyobit

スコア17

title CHANGED
File without changes
body CHANGED
@@ -39,4 +39,13 @@
39
39
 
40
40
  現在、解決方法を探し始めた状態での質問になります。
41
41
  新しい方法が見つかり次第、質問内容を更新していきます。
42
- アドバイスのほどよろしくお願いします。
42
+ アドバイスのほどよろしくお願いします。
43
+
44
+ 追記--
45
+ ```python
46
+ find = soup.find_all(tag)
47
+ for text in find:
48
+ text.string = start + text.string + end
49
+ #startとendはタグの種類によって変わる
50
+ ```
51
+ としてみたが結果は同じだった