只擦掉包含某些单词的段落

2024-09-27 19:27:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在开发一些代码从网站上抓取文本。我不想刮去整个页面,只想刮去页面中包含某些单词的部分。理想情况下,我想把包含这个词的整个段落删去。我见过使用.find_all(“p”)行的示例,但是我发现许多网站不使用HTML定义的段落(“p”)。因此,我不想这样做

现在,我使用的方法是在搜索某个单词之前和之后搜索文本。然而,这里的问题是,同样的句子可以被多次提及。例如,在下面的代码中,“干旱正在推动东非粮食价格急剧上涨”这句话被提到了三次。代码如下:

from urllib.request import Request, urlopen
from bs4 import BeautifulSoup
import re

url = "https://www.un.org/africarenewal/news/drought-pushing-food-prices-sharply-east-africa"
req = Request(url, headers={"User-Agent": 'Mozilla/5.0'})
page = urlopen(req, timeout = 5) # Open page within 5 seconds. This line skips 'empty' websites
htmlParse = BeautifulSoup(page.read(), 'lxml') #html5lib
SearchWords = ["drought", "water", "food"] # text must contain these words

textP = ""
text = ""
for word in SearchWords:
    print(word)
    for r in re.findall(re.compile('.{0,100}'+word+'.{0,100}'), htmlParse.text):
        textP = textP + r  

text= text + textP
print(text)

如前所述,我希望得到所有包含某个单词的段落,没有重复。有人有这方面的经验吗?非常感谢


Tags: 代码textfrom文本importre网站request
1条回答
网友
1楼 · 发布于 2024-09-27 19:27:42

要将字符串拆分为段落,可以使用Python re

re.split(r'(?:\r\n?|\n){2,}', htmlParse.text)

接下来,您希望获得包含预定义字符串之一的唯一段落:

pars = set([p for p in re.split(r'(?:\r\n?|\n){2,}', htmlParse.text) if any(x in p for x in SearchWords)])

现在,如果要执行不区分大小写的整词搜索,可以再次使用re

pars = set([p for p in re.split(r'(?:\r\n?|\n){2,}', htmlParse.text) if re.search(rf'\b(?:{"|".join(SearchWords)})\b', p, re.I)])

这里,\b(?:drought|water|food)\b正则表达式将droughtwaterfood作为整词查找,并且re.I将确保不区分大小写的搜索

相关问题 更多 >

    热门问题