【问题标题】:Beautiful Soup replaces < with &lt;Beautiful Soup 将 < 替换为 <
【发布时间】:2018-08-27 13:15:16
【问题描述】:

我找到了要替换的文本,但是当我打印 soup 时,格式发生了变化。 &lt;div id="content"&gt;stuff here&lt;/div&gt; 变为 &amp;lt;div id="content"&amp;gt;stuff here&amp;lt;/div&amp;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>

【问题讨论】:

  • 您的 index_file 以哪种格式保存?你能展示它的一部分吗? (我对 .html 文件和完全相同的代码没有任何问题)
  • 文件保存为.html。如果我打印 found 一切正常。如果我打印soup,那么我刚刚替换的found 将显示&amp;lt;div id="content"&amp;gt;stuff
  • 是您要执行的确切行吗?因为我尝试在BeautifulSoup中加载相同的内容,不存在这样的问题。
  • 如果不完全相同,则共享完全相同的代码并输出
  • 可变数据里面有什么? @user3525290

标签: python python-3.x beautifulsoup


【解决方案1】:

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 不会。

【讨论】:

  • 感谢您的解释。不知道我会想出来的。正朝着正则表达式解决方案前进。
  • @user3525290。我理解那种感觉。鉴于您现在所知道的,我建议您回顾一下我从头开始链接到的漂亮汤文档。如果您已经知道他们会说什么,他们会非常好:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-04
  • 2013-10-06
  • 2021-12-31
  • 1970-01-01
  • 1970-01-01
  • 2018-03-06
  • 2023-03-30
相关资源
最近更新 更多