【问题标题】:How do I remove a spurious tag in BeautifulSoup如何删除 BeautifulSoup 中的虚假标签
【发布时间】:2016-05-03 16:43:49
【问题描述】:

我正在从总统辩论中提取文本。我遇到了one,它有一个问题:它错误地将每次提到“辩论”这个词都变成了标签<debate>。继续,搜索“欢迎回到共和党总统”;注意到一个明显的单词丢失了吗?

很酷,所以 BeautifulSoup 在清理混乱的 HTML 和添加结束标签方面做得非常出色,因为它们 应该 应该是。但是在这种情况下,这让我很生气,因为<debate> 现在是<p> 的孩子,并且最后添加了</debate>。从而将剩余的辩论嵌套在该标签内。

如何告诉 BeautifulSoup 忽略或删除 <debate>?或者,如何在之后立即添加结束标签?我试过展开,但是当我可以调用它的时候,BS 已经在末尾设置了结束标签,因此使以下段落成为孩子而不是兄弟。

我的设置如下:

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 之间插入一些东西,但对于我来说,我无法弄清楚如何修改文件内容。

【问题讨论】:

    标签: python beautifulsoup urllib


    【解决方案1】:

    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>
    

    【讨论】:

    • 它不会出错,但现在它不会使用在其他成绩单上正常工作的行。例如 transcript = soup.find_all("span", class_="displaytext")[0] (越界),当我运行 print soup.prettify() 我可以看到我试图调用的跨度,但 find_all 赢了不要抓住它。
    • @ScottieB 您能否创建一个单独的问题,提供您目前拥有的代码并描述症状?在这里给我一个链接。谢谢。
    • 感谢@alecxe 的建议,发布:stackoverflow.com/questions/37052097/…
    猜你喜欢
    • 2016-03-26
    • 2020-02-26
    • 1970-01-01
    • 2020-01-24
    • 2013-10-19
    • 1970-01-01
    • 1970-01-01
    • 2017-03-31
    • 1970-01-01
    相关资源
    最近更新 更多