我使用BeautifulSoup的lxml解析器来解析一些html。但是,它没有被解析,因为它已被编写。例如,以下代码:
import bs4
my_html = '''
<html>
<body>
<B>
<P>
Hello, I am some bolded text
</P>
</B>
</body>
</html>
'''
soup = bs4.BeautifulSoup(my_html, 'lxml')
print soup.prettify()
将打印:
<html>
<body>
<b>
</b>
<p>
Hello, I am some bolded text
</p>
</body>
</html>
您可以看到来自<B>
的{{1}}标记以某种方式在美化版本中的my_html
标记之前关闭,即使它应该在{{1}之后关闭}。关于可能发生的事情的任何想法?我完全不知所措。
答案 0 :(得分:2)
这是因为<b>
标记内不允许使用段落。
只允许接受流内容的标记作为<p>
标记的父标记。有关列表,请参阅here。
然而,你可以反过来;允许<p>
作为<b>
标记的父级。在您的情况下,您可以将原始HTML更改为以下内容:
my_html = '''
<html>
<body>
<p>
<b>
Hello, I am some bolded text
</b>
</p>
</body>
</html>
'''
答案 1 :(得分:1)
这是因为您在<p>
标记内没有<b>
标记,因此解析器正在尝试修复损坏的HTML。使用html5lib的html5lib
解析器或Python的html.parser
将导致您的预期输出(我只知道这是因为我刚测试过它)。