我正在尝试将一个iframe的内容替换为BeautifulSoup对象。让我们说吧
s="""
<!DOCTYPE html>
<html>
<body>
<iframe src="http://www.w3schools.com">
<p>Your browser does not support iframes.</p>
</iframe>
</body>
</html>
"""
是用
解析的原始htmldom = BeatifulSoup(s, 'html.parser')
我得到了f = dom.find('iframe')
现在我想只用另一个BeautifulSoup对象替换iframe的内容,例如对象newBO。如果我做f.replace_with(newBO)
它工作但我丢失了原始文件的层次结构,因为iframe标记已经消失。如果不是一个BeautifulSoup对象,我只有一个字符串,我可以f.string = 'just a string'
,这将取代内容,但如果我做f.string = newBO
我得到了
TypeError:'NoneType'对象不可调用
所以我尝试使用replace_with
,但在newBO中添加iframe
标记。我怎样才能做到这一点?你能用其他方式提出建议吗?
答案 0 :(得分:2)
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)
,因为它将是唯一的元素。