Python 带br标记的Beautifulsoup同级结构

Python 带br标记的Beautifulsoup同级结构,python,beautifulsoup,Python,Beautifulsoup,我正试图使用BeautifulSoup Python库解析HTML文档,但结构被标记扭曲。让我给你举个例子 输入HTML: <div> some text <br> <span> some more text </span> <br> <span> and more text </span> </div> 一些文本 更多文本 还有更多的文字 美化组解释的HTML: <div&g

我正试图使用BeautifulSoup Python库解析HTML文档,但结构被

标记扭曲。让我给你举个例子

输入HTML:

<div>
  some text <br>
  <span> some more text </span> <br>
  <span> and more text </span>
</div>

一些文本
更多文本
还有更多的文字
美化组解释的HTML:

<div>
  some text
  <br>
    <span> some more text </span>
    <br>
      <span> and more text </span>
    </br>
  </br>
</div>

一些文本

更多的文字
还有更多的文字

在源代码中,可以将跨度视为兄弟。解析(使用默认解析器)后,跨度突然不再是同级,因为br标记成为结构的一部分


我能想到的解决方法是在将html注入Beautifulsoup之前,将

标记全部剥离,但这似乎不是很优雅,因为它需要我更改输入。解决这个问题的更好方法是什么?

你最好的办法是
提取()
换行符。这比你想象的要容易:)

>>从bs4导入BeautifulSoup作为BS
>>>html=”“”
…一些文本
…更多文本
…还有更多的文字 ... """ >>>soup=BS(html) >>>用于汤中的换行符。查找所有('br'): ... linebreak.extract() ...

>>>打印汤。美化 一些文本 更多的文字 还有更多的文字
您也可以这样做:

str(soup).replace("</br>", "")
str(汤)。替换(“
”,“”)
这是一个非常老的问题,但我刚刚遇到了一个类似的问题,因为我的文档包含closong

标记。正因为如此,beatifulsoup(我想是bs试图处理一个结束标记。)
soup.find_all('br')
实际上没有找到任何东西,因为没有打开的
br
标记,所以我无法使用
extract()
方法

在猛击我的头一个小时后,我发现使用
lxml
解析器而不是默认的html解决了这个问题


soup=BeautifulSoup(page,'lxml')

如果有两个span标记,您似乎有
甚至修复了span,我已经使用bs4重新创建了错误。然而,bs3没有任何问题。跨度是一个输入错误,所以,不是在我的实际代码中。dilbert是正确的。尽管如此,bs4还是有一个问题。很高兴看到它能工作,但我在文档中找不到提取方法。它有什么作用?@Joost谢谢你的链接!看到它这样应用有点奇怪,因为它并没有真正删除

标记(后者由BS创建)之间的内容。不完全是这个示例在文档中的工作方式,也删除了标记的内容。Bug还是功能?@Joost我可能错了,但是


实际上是一样的。它不是您打开/关闭的标记之一(我不是HTML专家)。我认为唯一的区别是后者已被弃用,但请不要引用我的话。请注意,它还将添加冗余标记,更糟糕的是,如果在某些HTML标记中有未关闭的片段文本,它将由span元素包装。很清楚,您对lxml解析器的评论是默认的还是,注意每个解析器如何添加不成功的元素和/或自动更改无效的HTML(例如,
自动更改为
,等等)。哦,好的,谢谢你的链接。看起来这是大多数人都做的,至少lxml没有添加标记。我需要将它的输出分配给某个变量吗?如果你想在某个地方使用它,当然
str(soup).replace("</br>", "")