gpt4 book ai didi

python - 只抓取包含特定单词的段落

转载 作者:行者123 更新时间:2023-12-05 04:51:26 24 4
gpt4 key购买 nike

我正在开发一些代码来从网站上抓取文本。我对抓取整个页面不感兴趣,而只是抓取包含某些词的页面部分。理想情况下,我想抓取包含该词的整个段落。我见过使用 .find_all("p") 行的示例,但是我发现许多网站不使用 HTML 定义的段落 ("p")。因此,我想避免这样做。

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

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)

如前所述,理想情况下,我会得到所有包含某个词的段落,没有重复。有没有人有这方面的经验?非常感谢!

最佳答案

要将字符串拆分为段落,您可以使用 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 正则表达式将查找droughtwater food 作为整个单词和 re.I 将确保不区分大小写的搜索。

关于python - 只抓取包含特定单词的段落,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66917980/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com