在replaceWith()之后查找()不';t工作(使用BeautifulSoup) 请考虑下面的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> >>从BeautifulSoup导入BeautifulSoup >>>s=BeautifulSoup(“
这是一个测试。”);myi=s.find(“i”) >>>myi.替换为(BeautifulSoup(“was”)) >>>s.find(“我”) >>>s=BeautifulSoup(“这是一个测试。”);myi=s.find(“i”) >>>myi.替换为(“was”) >>>s.find(“我”) 测试 请注意第4行后面缺少的s.find(“i”)输出 这是什么原因?有解决办法吗 编辑:实际上,该示例没有演示用例,即:在replaceWith()之后查找()不';t工作(使用BeautifulSoup) 请考虑下面的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> >>从BeautifulSoup导入BeautifulSoup >>>s=BeautifulSoup(“,python,find,beautifulsoup,Python,Find,Beautifulsoup,这是一个测试。”);myi=s.find(“i”) >>>myi.替换为(BeautifulSoup(“was”)) >>>s.find(“我”) >>>s=BeautifulSoup(“这是一个测试。”);myi=s.find(“i”) >>>myi.替换为(“was”) >>>s.find(“我”) 测试 请注意第4行后面缺少的s.find(“i”)输出 这是什么原因?有解决办法吗 编辑:实际上,该示例没有演示用例,即: myi.replaceWith(BeautifulSoup("wa&
myi.replaceWith(BeautifulSoup("wa<b>s</b>"))
myi.replacetwith(BeautifulSoup(“was”))
每当插入的部分本身包含非平凡的html代码时,我不知道如何用其他语法替换此语法。只是有
myi.replaceWith("wa<b>s</b>")
myi.replaceWith(“was”)
将用实体替换html特殊字符。问题似乎是
美化组
对象被视为一个完整的文档find
遍历文档,询问每个元素后面的下一个元素。但是当它到达您的美化组(“was”)
时,该对象认为它是整个文档,所以它说后面没有任何内容。这会过早中止搜索
我不认为BeautifulSoup设计为在其他BeautifulSoup对象中包含BeautifulSoup对象。解决办法是不要那样做。为什么您觉得需要使用第一种形式,而不是第二种已经有效的形式?如果您想用一些HTML替换元素,请使用
标记来替换,而不是BeautifulSoup
对象。我想,我找到了一个解决方法,它为我解决了这个问题。我以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()
有人能解释一下,为什么跳过list()
会忽略s
?(请在评论中回答,因为这不是这里的主要问题。)更简单的回答:调用replacetwith
后,通过调用s=BeautifulSoup(s.renderContents())
重新生成并清理s
。然后你可以再次找到
。我承认我的例子没有说明为什么我需要这个奇怪的结构,我在上面添加了进一步的解释。但是,你的解释是完全正确的,谢谢!不过,如果有一个变通办法,那就太好了。(所以不要生我的气,因为我没有把你的答案标记为解决方案。)@thomas:有一个关于类似问题的错误报告。一条评论说它已经解决了,但我仍然觉得它坏了,我无法理解那里的解释。您可能想对该错误进行评论,并展示您的示例,看看他们说了什么。为什么您需要用sometag.renderContents()
替换,而不仅仅是用sometag
替换?好的,让我们通过添加一个不同的示例来更具体一些。。。(见上文,我再次编辑)之所以需要列表
,是因为它所说的:一个元素只能出现在文档中的一个位置。执行insert
时,它会从s2.contents
中删除第一个元素,以便将其插入其他位置。因此,您在迭代s2时正在修改它。请注意,renderContents
现在称为encode\u contents
for c in list(s2.contents):
myi.parent.insert(myi_id + 1, c)