BeautifulSoup:不要在重要的地方添加空格,在不重要的地方删除它们

时间:2014-08-26 20:10:39

标签: python html beautifulsoup

此示例python程序:

document='''<p>This is <i>something</i>, it happens
               in <b>real</b> life</p>'''
from bs4 import BeautifulSoup
soup = BeautifulSoup(document)
print(soup.prettify())

产生以下输出:

<html>
 <body>
  <p>
   This is
   <i>
    something
   </i>
   , it happens
               in
   <b>
    real
   </b>
   life
  </p>
 </body>
</html>

这是错误的,因为它在每个开始和结束标记之前和之后添加了空格,例如,</i>,之间不应该有空格。我想要:

  1. 不添加没有空格的空格(即使在块级标记周围,如果它们在CSS中使用display:inline进行样式处理,也可能会出现问题。)

  2. 折叠单个空格中的所有空格,但可选择换行。

  3. 这样的事情:

    <html>
     <body>
      <p>This is
       <i>something</i>,
       it happens in
       <b>real</b> life</p>
     </body>
    </html>
    

    BeautifulSoup这可能吗?任何其他推荐的HTML解析器可以解决这个问题吗?

3 个答案:

答案 0 :(得分:3)

Beautiful Soup的.prettify()方法被定义为在自己的行(http://www.crummy.com/software/BeautifulSoup/bs4/doc/index.html#pretty-printing)上输出每个标记。如果你想要别的东西,你需要通过走解析树来自己做。

答案 1 :(得分:3)

由于习惯.prettify将每个标记放入其自己的行中,因此不适合生产代码;它只能用于调试输出,IMO。只需使用str内置函数将汤转换为字符串。

您想要的是更改树中的字符串内容;你可以创建一个函数来查找包含两个或多个空格字符序列的所有元素(使用预编译的正则表达式),然后替换它们的内容。

顺便说一句,如果你像这样编写你的例子,你可以让Python避免插入无关紧要的空格:

document = ('<p>This is <i>something</i>, it happens '
            'in <b>real</b> life</p>')

这样你就有两个隐式连接的文字。

答案 2 :(得分:0)

正如之前的评论和thebjorn所说的那样,BeautifulSoup对漂亮html的定义就是每个标签上都有自己的行,但是,要处理你的一些问题与你的间距等等可以像这样崩溃它:

from bs4 import BeautifulSoup

document = """<p>This is <i>something</i>, it happens
               in <b>real</b> life</p>"""

document_stripped = " ".join(l.strip() for l in document.split("\n"))

soup = BeautifulSoup(document_stripped).prettify()

print(soup)

哪个输出:

<html>
 <body>
  <p>
   This is
   <i>
    something
   </i>
   , it happens in
   <b>
    real
   </b>
   life
  </p>
 </body>
</html>