6

次の python セッションを検討してください。

>>> from BeautifulSoup import BeautifulSoup
>>> s = BeautifulSoup("<p>This <i>is</i> a <i>test</i>.</p>"); myi = s.find("i")
>>> myi.replaceWith(BeautifulSoup("was"))
>>> s.find("i")
>>> s = BeautifulSoup("<p>This <i>is</i> a <i>test</i>.</p>"); myi = s.find("i")
>>> myi.replaceWith("was")
>>> s.find("i")
<i>test</i>

4 行目以降の s.find("i") の出力が欠落していることに注意してください。

これの理由は何ですか?回避策はありますか?

編集:実際には、この例はユースケースを示していません。

myi.replaceWith(BeautifulSoup("wa<b>s</b>"))

挿入された部分に重要な html コードが含まれている場合は常に、この構文を別のものに置き換える方法がわかりません。持っているだけで

myi.replaceWith("wa<b>s</b>")

html 特殊文字をエンティティに置き換えます。

4

3 に答える 3

5

より簡単な答え: を呼び出した後、 を呼び出してreplaceWith再生成およびクリーンアップss = BeautifulSoup(s.renderContents())ます。その後、再びできますfind

于 2013-10-26T21:42:36.717 に答える
3

問題は、BeautifulSoupオブジェクトがドキュメント全体と見なされることにあるようです。 findドキュメントを反復処理して、各要素に次の要素を要求します。しかし、それがあなたの に到達するBeautifulSoup("was")と、そのオブジェクトはそれが文書全体であると考えるので、その後には何もないと言います。これにより、検索が早すぎます。

BeautifulSoup が BeautifulSoup オブジェクトを他の BeautifulSoup オブジェクト内に持つように設計されているとは思いません。回避策は、それをしないことです。すでに機能している 2 番目の形式ではなく、最初の形式を使用する必要があると思うのはなぜですか? 要素を HTML の一部に置き換えたい場合は、オブジェクトTagではなく a を使用してください。BeautifulSoup

于 2013-03-16T22:20:20.247 に答える
2

問題を解決する回避策を見つけたと思います。完全な例を示すために、コード全体を Python スクリプトとしてもう一度繰り返します。

from BeautifulSoup import BeautifulSoup
s = BeautifulSoup("<p>This <i>is</i> a <i>test</i>.</p>")
myi = s.find("i")
s2 = BeautifulSoup("wa<b>s</b>")
myi_id = myi.parent.contents.index(myi)
for c in reversed(s2.contents):
    myi.parent.insert(myi_id + 1, c)
myi.extract()

これがないと機能しないことに注意してくださいreversed()。スキップすると、要素の順序が変わるだけではありません。本当に順序を変更したい場合は、次のように記述する必要があります。

for c in list(s2.contents):
    myi.parent.insert(myi_id + 1, c)

誰かが説明してもらえますか、なぜスキップlist()が省略されるの<b>s</b>ですか? (これはここでの主な質問ではないので、コメントで答えてください。)

于 2013-03-16T23:29:07.057 に答える