使用Beautiful Soup美化代码
使用 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
继承而来的。