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遍历文档,向每个元素询问其后的下一个元素。但是当它到达 your 时BeautifulSoup("was"),该对象认为它是整个文档,所以它说它后面没有任何内容。这会过早中止搜索。

我不认为 BeautifulSoup 的设计目的是在其他 BeautifulSoup 对象中包含 BeautifulSoup 对象。解决方法是不要那样做。为什么你觉得你需要使用第一种形式而不是已经有效的第二种形式?如果您想用一些 HTML 替换元素,请使用 aTag代替,而不是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 回答