美丽汤用<代替<

时间:2018-08-27 13:15:16

标签: python python-3.x beautifulsoup

我找到了要替换的文本,但是当我打印soup时,格式被更改了。 <div id="content">stuff here</div>成为&lt;div id="content"&gt;stuff here&lt;/div&gt;。如何保存数据?我尝试过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>

1 个答案:

答案 0 :(得分:4)

found对象不是Python字符串,而是Tag,恰好具有不错的字符串表示形式。您可以这样做

type(found)

Tag是Beautiful Soup为使您能够与HTML交互而创建的对象层次结构的一部分。另一个这样的对象是NavigableStringNavigableString很像一个字符串,但是它只能包含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不显示更新的原因。