如何将外部标记添加到BeautifulSoup对象

时间:2016-10-06 09:09:16

标签: python html iframe beautifulsoup

我正在尝试将一个iframe的内容替换为BeautifulSoup对象。让我们说吧

 s="""
 <!DOCTYPE html>
 <html>
 <body>

 <iframe src="http://www.w3schools.com">         
   <p>Your browser does not support iframes.</p>
 </iframe>

 </body>
 </html>
 """

是用

解析的原始html
dom = BeatifulSoup(s, 'html.parser')

我得到了f = dom.find('iframe')

的iframe

现在我想只用另一个BeautifulSoup对象替换iframe的内容,例如对象newBO。如果我做f.replace_with(newBO) 它工作但我丢失了原始文件的层次结构,因为iframe标记已经消失。如果不是一个BeautifulSoup对象,我只有一个字符串,我可以f.string = 'just a string',这将取代内容,但如果我做f.string = newBO

我得到了

  

TypeError:'NoneType'对象不可调用

所以我尝试使用replace_with,但在newBO中添加iframe标记。我怎样才能做到这一点?你能用其他方式提出建议吗?

1 个答案:

答案 0 :(得分:2)

extract内容然后insert

from bs4 import BeautifulSoup
dom = BeautifulSoup(s, 'html.parser')

f = dom.find('iframe')
for ele in f.find_all():
    ele.extract()
new = BeautifulSoup("<div>foo</div>").find("div")
f.insert(0, new)
print(dom)

哪会给你:

 <!DOCTYPE html>

<html>
<body>
<iframe src="http://www.w3schools.com"><div>foo</div>

</iframe>
</body>
</html>

还要删除任何字符串集f.string=""

f = dom.find('iframe')

for ele in f.find_all():
    print(type(ele))
    ele.extract()
f.string = ""
new = BeautifulSoup("<div>foo</div>","html.parser").find("div")
f.insert(0, new)
print(dom)

然后会给你:

<!DOCTYPE html>

<html>
<body>
<iframe src="http://www.w3schools.com"><div>foo</div></iframe>
</body>
</html>

在这种情况下,你也可以使用f.append(new),因为它将是唯一的元素。