BeautifulSoup lxml解析器关闭它不应该的标签

时间:2016-07-20 19:53:28

标签: python html beautifulsoup

我使用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}之后关闭}。关于可能发生的事情的任何想法?我完全不知所措。

2 个答案:

答案 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将导致您的预期输出(我只知道这是因为我刚测试过它)。

相关问题