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

回答編集履歴

1

コメントに対しての回答

2020/03/18 00:30

投稿

jeanbiego
jeanbiego

スコア3966

answer CHANGED
@@ -26,4 +26,23 @@
26
26
 
27
27
  # 漢<かん>字<じ>
28
28
  # 文<も>字<じ>ごとにルビを振<ふ>るサンプルです。
29
- ```
29
+ ```
30
+
31
+ 以下、コメントに対して
32
+ ・下記のようにするとわかりますが、stringは子要素の文字列が1つだけなら拾えますが、複数あるとNoneを返すようです。
33
+ 参考:[Beautifulsoup4のtextとstringの違い](https://irukanobox.blogspot.com/2016/06/beautifulsoup4textstring.html?m=0)
34
+ ```python3
35
+ for tag in s.find_all():
36
+ print(tag)
37
+ print("string: ",tag.string)
38
+ print("text: ",tag.text)
39
+ ```
40
+ で、for tag in s.find_all():という指定だと<p><ruby>漢<rt>かん</rt>字<rt>じ</rt></ruby></p>などは、<p>の中にrubyとかrtとか複数の子要素があるのでNoneを返してしまいます。
41
+ で、x='<' + tag.string + '>'が文字列+None+文字列となって、まず失敗します。
42
+ 次に、置き換えの際にもtag.textが複数の文字列の集合体なので、置換に失敗するようです。
43
+
44
+ ・元コードではrtタグに指定するためかif tag.find_all('rt'):が使われていますが、これだと「tagの内部にrtタグを含むか」という条件になってしまい、htmlとかbodyの大枠でもTrueになります。
45
+ あえてやるならば、if tag.name == "rt":です。
46
+ ただ、わざわざifでやらなくてもfor tag in s.find_all("rt"):という指定でrtタグだけ回してあげれば、スムーズに行くようです。
47
+
48
+ あとオマケで、i=0は使ってないので不要なのと、a=tag.text.replace(tag.string,x)はaという置換後の文字列を代入した変数が増えただけで、元のtagを置き換えてはいないので効果がありません。