我找到了要替换的文本,但是当我打印soup
时,格式被更改了。 <div id="content">stuff here</div>
成为<div id="content">stuff here</div>
。如何保存数据?我尝试过print(soup.encode(formatter="none"))
,但是会产生相同的错误格式。
from bs4 import BeautifulSoup
with open(index_file) as fp:
soup = BeautifulSoup(fp,"html.parser")
found = soup.find("div", {"id": "content"})
found.replace_with(data)
当我打印found
时,我得到了正确的格式:
>>> print(found)
<div id="content">stuff</div>
index_file
的内容如下:
<!DOCTYPE html>
<head>
Apples
</head>
<body>
<div id="page">
This is the Id of the page
<div id="main">
<div id="content">
stuff here
</div>
</div>
footer should go here
</div>
</body>
</html>
答案 0 :(得分:4)
found
对象不是Python字符串,而是Tag
,恰好具有不错的字符串表示形式。您可以这样做
type(found)
Tag
是Beautiful Soup为使您能够与HTML交互而创建的对象层次结构的一部分。另一个这样的对象是NavigableString
。 NavigableString
很像一个字符串,但是它只能包含HTML内容部分中的内容。
这样做的时候
found.replace_with('<div id="content">stuff here</div>')
您要用包含文本文字的Tag
替换NavigableString
。 HTML能够显示该字符串的唯一方法是在执行操作时将所有尖括号转义。
您可能希望保留Tag
而不是麻烦,而只替换其内容:
found.string.replace_with('stuff here')
请注意,正确的替换操作不会覆盖标记。
执行found.replace_with(...)
时,名称found
所引用的对象将在父层次结构中被替换。但是,名称found
始终指向与以前相同的过时对象。这就是为什么打印soup
显示更新,而打印found
不显示更新的原因。