回答編集履歴

1

コメントに対しての回答

2020/03/18 00:30

投稿

jeanbiego
jeanbiego

スコア3966

test CHANGED
@@ -55,3 +55,41 @@
55
55
  # 文<も>字<じ>ごとにルビを振<ふ>るサンプルです。
56
56
 
57
57
  ```
58
+
59
+
60
+
61
+ 以下、コメントに対して
62
+
63
+ ・下記のようにするとわかりますが、stringは子要素の文字列が1つだけなら拾えますが、複数あるとNoneを返すようです。
64
+
65
+ 参考:[Beautifulsoup4のtextとstringの違い](https://irukanobox.blogspot.com/2016/06/beautifulsoup4textstring.html?m=0)
66
+
67
+ ```python3
68
+
69
+ for tag in s.find_all():
70
+
71
+ print(tag)
72
+
73
+ print("string: ",tag.string)
74
+
75
+ print("text: ",tag.text)
76
+
77
+ ```
78
+
79
+ で、for tag in s.find_all():という指定だと<p><ruby>漢<rt>かん</rt>字<rt>じ</rt></ruby></p>などは、<p>の中にrubyとかrtとか複数の子要素があるのでNoneを返してしまいます。
80
+
81
+ で、x='<' + tag.string + '>'が文字列+None+文字列となって、まず失敗します。
82
+
83
+ 次に、置き換えの際にもtag.textが複数の文字列の集合体なので、置換に失敗するようです。
84
+
85
+
86
+
87
+ ・元コードではrtタグに指定するためかif tag.find_all('rt'):が使われていますが、これだと「tagの内部にrtタグを含むか」という条件になってしまい、htmlとかbodyの大枠でもTrueになります。
88
+
89
+ あえてやるならば、if tag.name == "rt":です。
90
+
91
+ ただ、わざわざifでやらなくてもfor tag in s.find_all("rt"):という指定でrtタグだけ回してあげれば、スムーズに行くようです。
92
+
93
+
94
+
95
+ あとオマケで、i=0は使ってないので不要なのと、a=tag.text.replace(tag.string,x)はaという置換後の文字列を代入した変数が増えただけで、元のtagを置き換えてはいないので効果がありません。