質問編集履歴
3
追記を追加
    
        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
追記を追加
    
        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
追記を追加
    
        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 | 
            +
            としてみたが結果は同じだった
         | 
