使用 BeautifulSoup 提取文本时在段落之间添加空格

avi*_*iss 4 beautifulsoup python-2.7

我需要从新闻文章中提取有用的文本。我用 BeautifulSoup 做这件事,但输出把一些段落粘在一起,这阻止了我进一步分析文本。

我的代码:

import requests
from bs4 import BeautifulSoup
r = requests.get("http://www.bbc.co.uk/news/uk-england-39607452")
soup = BeautifulSoup(r.content, "lxml")

# delete unwanted tags:
for s in soup(['figure', 'script', 'style']):
    s.decompose()

article_soup = [s.get_text() for s in soup.find_all(
                'div', {'class': 'story-body__inner'})]
article = ''.join(article_soup)
print(article)
Run Code Online (Sandbox Code Playgroud)

输出看起来像这样(只有前 5 个句子):

在耶路撒冷被刺死的英国学生汉娜·布拉登 (Hannah Bladon) 的家人表示,他们对这场“毫无意义和悲惨的袭击”感到“震惊”。 20 岁的布拉登女士于耶稣受难日在耶路撒冷的一辆电车上遭到袭击。她去世时在耶路撒冷希伯来大学学习,那天早上一直在参与考古挖掘。布拉登女士的胸部被刺了几次,在医院里死亡。她遭到一名男子的袭击,他从包里拿出一把刀,在老城附近的电车上反复刺伤她,因为基督徒庆祝耶稣受难节和犹太人庆祝逾越节,电车很忙。

我尝试在某些标点符号后添加一个空格,例如“.”、“?”和“!”。

article = article.replace(".", ". ")
Run Code Online (Sandbox Code Playgroud)

它适用于段落(尽管我相信应该有更聪明的方法来做到这一点),但不适用于文章不同部分的字幕,这些部分最终没有任何标点符号。它们的结构如下:

</p>
<h2 class="story-body__crosshead">
Subtitle text
</h2>
<p>
Run Code Online (Sandbox Code Playgroud)

我将不胜感激您的建议。

PS:当我“加入”article_soup 时添加一个空格没有帮助。

Zro*_*roq 12

您可以使用separatorin your get_text,它将获取当前元素中由给定字符分隔的所有字符串。

article_soup = [s.get_text(separator="\n", strip=True) for s in soup.find_all( 'div', {'class': 'story-body__inner'})]
Run Code Online (Sandbox Code Playgroud)