如何删除 <br> 标签但将所有内容保留在同一段落中

How to remove <br> tag but keep everything within the same paragraph

这是我第一次发帖,所以希望我能够尽可能清楚地说明这一点。

对于一项作业,我必须使用 BeautifulSoup 来抓取 made-up 网页并从每个出版物页面中提取所有标题和摘要。一般来说,我已经能够通过在每一页上找到摘要段落并将其附加到一个空列表来做到这一点。但是,其中一页将摘要分成几个小块,由
.

分隔

这很烦人,因为它没有被视为一个摘要,而是被视为 5 个不同的摘要,因此它影响了以下所有出版物并且 title-abstracts 不匹配。

我尝试使用以下代码提取

#text from abstract
abstracttext = []

for url in final_list:
    page = requests.get(url)
    soup = BeautifulSoup(page.content, "html.parser")
#    print(soup.prettify())

    necessarytext = soup.find("p")
    
    for e in soup.find_all('br'):
        e.extract()

#    print(necessarytext)
    
    for text in necessarytext:
        abstracttext.append(text)

#print(abstracttext)

如果我现在查看 'necessarytext',问题似乎已解决,因为所有句子都在同一段落中。但是,一旦我继续将所有内容附加到空列表中,句子就会再次分开,就好像它们是不同的段落一样,然后将所有内容都扔掉。

有人知道为什么会这样吗?有什么方法可以删除
但确保所有内容都在同一段内,还是有一种 general-purpose 方法可以将所有这些句子连接在一起?对不起,如果我有点不清楚,我很感激你能给我的帮助。

编辑:代码中的 'url' 来自我之前的 web-scraping。这些出版物按主题分组,因此我能够浏览每个主题并从那里提取出版物页面。所有唯一的 URL 都被添加到一个名为 'final_list' 的列表中,因此这个 for 循环应该遍历每个发布页面以提取摘要。希望更清楚。

要从 <p> 中删除 <br>,您可以使用 extract()decompose():

...
necessarytext = soup.find("p")

for x in necessarytext:
    if x.name == 'br':
        x.extract()
        ##or 
        ##x.decompose()

abstracttext.append(necessarytext)
...

注意 因为它不是那么清楚 - 如果你根本不需要 <p> 只需调用 abstracttext.append(soup.find("p").text) 这将给出没有 <br/>

<p> 的纯文本

例子

import requests
from bs4 import BeautifulSoup

abstracttext = []

html='''<p>a <br/> b <br/> c</p>'''
soup = BeautifulSoup(html, "html.parser")
necessarytext = soup.find("p")
for x in necessarytext:
    if x.name == 'br':
        x.decompose()

abstracttext.append(necessarytext)

print(abstracttext)

输出

[<p>a  b  c</p>]