使用换行符修改BeautifulSoup .string

时间:2015-02-07 18:38:04

标签: python html beautifulsoup

我正在尝试使用BeautifulSoup更改html文件的内容。这个内容将来自基于python的文本,因此它将有\ n换行符......

newContent = """This is my content \n with a line break."""
newContent = newContent.replace("\n", "<br>")
htmlFile.find_all("div", "product").p.string = newContent

当我这样做时,html文件<p>文本更改为:

This is my content &lt;br&gt; with a line break.

如何更改BeautifulSoup对象中的字符串并使<br>中断?如果字符串只包含\n,那么它将创建一个实际的换行符。

1 个答案:

答案 0 :(得分:2)

您需要创建单独的元素; <p>标记中不包含一个文本,但是包含一系列文本和<br/>元素。

不是将\n换行符替换为文本<br/>(将被转义),而是将文本拆分为换行符并在其间插入额外的元素:

parent = htmlFile.find_all("div", "product")[0].p
lines = newContent.splitlines()
parent.append(htmlFile.new_string(lines[0]))
for line in lines[1:]:
    parent.append(htmlFile.new_tag('br'))
    parent.append(htmlFile.new_string(line))

这使用Element.append() method向树中添加新元素,并使用BeautifulSoup.new_string() and BeautifulSoup.new_tag()创建这些额外元素。

演示:

>>> from bs4 import BeautifulSoup
>>> htmlFile = BeautifulSoup('<p></p>')
>>> newContent = """This is my content \n with a line break."""
>>> parent = htmlFile.p
>>> lines = newContent.splitlines()
>>> parent.append(htmlFile.new_string(lines[0]))
>>> for line in lines[1:]:
...     parent.append(htmlFile.new_tag('br'))
...     parent.append(htmlFile.new_string(line))
... 
>>> print htmlFile.prettify()
<html>
 <head>
 </head>
 <body>
  <p>
   This is my content
   <br/>
   with a line break.
  </p>
 </body>
</html>