使用Beautiful Soup美化代码

0 投票
1 回答
1896 浏览
提问于 2025-04-18 16:41

使用 prettify() 函数,我可以把 HTML 代码格式化得很好。我听说这个函数甚至可以正确处理一些有问题的 HTML 代码,比如标签打开了但没有关闭的情况,prettify 可以帮助修复这些问题。不过,只有这个函数能做到吗?还是说在把数据加载到 Beautiful Soup 对象后,比如用 soup = BeautifulSoup(data),就能让这个 soup 对象对有问题的 HTML 代码更有抵抗力呢?举个例子,如果我有一段有问题的代码:

<body>
 <p><b>Paragraph.</p>
</body>

当我把它加载到 BS 对象时,它在 soup 对象里显示的是原样的代码,还是已经修复过的代码呢?

<body>
 <p><b>Paragraph.</b></p>
</body>

1 个回答

3

在创建“汤”的时候,HTML的标记就已经被修正了,而不是在美化输出的时候。这是为了让BeautifulSoup能够正确地浏览文档。

下面你可以看到,汤的字符串表示中包含了修正后的标记:

>>> from bs4 import BeautifulSoup
>>> text="""<body>
...  <p><b>Paragraph.</p>
... </body>
... """
>>> soup = BeautifulSoup(text)
>>> str(soup)
'<body>\n<p><b>Paragraph.</b></p>\n</body>\n'
>>> 

如果你查看class BeautifulStoneSoup的源代码,你会发现有一个注释提到了你提到的标记问题:

    This class contains the basic parser and search code. It defines
    a parser that knows nothing about tag behavior except for the
    following:

      You can't close a tag without closing all the tags it encloses.
      That is, "<foo><bar></foo>" actually means
      "<foo><bar></bar></foo>".

然后在源代码的后面,你可以看到BeautifulSoup是从BeautifulStoneSoup继承而来的。

撰写回答