如何删除 BeautifulSoup 中的虚假标签

How do I remove a spurious tag in BeautifulSoup

我正在从总统辩论中提取文本。我到达 one 时遇到了一个问题:它错误地将每次提及单词 "debate" 的内容都变成了标签 <debate>。继续,搜索 "Welcome back to the Republican presidential";注意到一个明显的单词丢失了吗?

太棒了,所以 BeautifulSoup 在清理混乱 HTML 和添加结束标签方面做得非常出色,他们 应该 应该这样做。但是在这种情况下,这让我很困惑,因为 <debate> 现在是 <p> 的 child 并且结束的 </debate> 被添加到最后;从而将剩余的辩论嵌套在该标签内。

如何告诉 BeautifulSoup 忽略或删除 <debate>?或者,如何在之后立即添加结束标记?我试过 unwrap,但是当我可以调用它时,BS 已经在最后设置了结束标记,因此制作了以下段落 children 而不是 siblings.

我是这样设置的:

from bs4 import BeautifulSoup
import urllib

bad_debate = 'http://www.presidency.ucsb.edu/ws/index.php?pid=111395'
file = urllib.urlopen(bad_debate)
soup = BeautifulSoup(file)

我的直觉是我需要在 url 调用和 BeautifulSoup 之间插入一些东西,但我一直不知道如何修改文件内容。

在这种情况下,

html5lib parser 在处理 debate 元素方面做得更好(比 lxmlhtml.parser):

soup = BeautifulSoup(file, "html5lib")

以下是它如何处理辩论中提到的部分:

<p>
    <b>
     BARTIROMO:
    </b>
    Welcome back to the Republican presidential
    <debate>
     here in North Charleston. Right back to the questions. [
     <i>
      applause
     </i>
     ]
    </debate>
</p>