为了账号安全,请及时绑定邮箱和手机立即绑定

Python Web Scraping - 只查找 n 个项目

Python Web Scraping - 只查找 n 个项目

慕妹3242003 2023-07-27 16:15:22
我正在运行一个用 Beautiful Soup 制作的抓取脚本。我从 Google 新闻中抓取结果,并且只想获取作为元组添加到变量中的前 n 个结果。该元组由新闻标题和新闻链接组成。在完整的脚本中,我有一个关键字列表,例如 ['crisis','finance'] 等,您可以忽略该部分。这就是代码。import bs4,requestsarticles_list = []base_url = 'https://news.google.com/search?q=TEST%20when%3A3d&hl=en-US&gl=US&ceid=US%3Aen' request = requests.get(base_url) webcontent = bs4.BeautifulSoup(request.content,'lxml')         for i in webcontent.findAll('div',{'jslog':'93789'}):              for link in i.findAll('a', attrs={'href': re.compile("/articles/")},limit=1):                 if any(keyword in i.select_one('h3').getText() for keyword in keyword_list):                     articles_list.append((i.select_one('h3').getText(),"https://news.google.com"+str(link.get('href')))) 这样写就是将满足 if 语句的所有新闻和链接添加为元组,这可能会导致一个很长的列表。我只想获取前 n 条新闻,假设有 5 条,然后我希望脚本停止。我试过:for _ in range(5):但我不明白在哪里添加它,因为代码要么没有运行,要么附加相同的新闻 5 次。我也尝试过:while len(articles_list)<5:但由于该语句是 for 循环的一部分,并且变量articles_list 是全局的,因此它也停止为下一个抓取对象追加内容。最后我尝试了:for tuples in (articles_list[0:5]): #Iterate in the tuple,        for element in tuples: #Print title, link and a divisor            print(element)        print('-'*80)如果没有其他选择,我可以做最后一个,但我会避免,因为变量articles_list无论如何都会包含比我需要的更多的元素。你能帮我理解我所缺少的吗?
查看完整描述

1 回答

?
子衿沉夜

TA贡献1828条经验 获得超3个赞

您的代码中有一个双循环。要退出这两个循环,您需要使用break两次,每个循环一次。您可以在两个循环中的相同条件下中断。


试试这个代码:


import re

import bs4,requests


keyword_list = ['health','Coronavirus','travel']

articles_list = []


base_url = 'https://news.google.com/search?q=TEST%20when%3A3d&hl=en-US&gl=US&ceid=US%3Aen' 

request = requests.get(base_url) 

webcontent = bs4.BeautifulSoup(request.content,'lxml') 


maxcnt = 5  # max number of articles

     

for ictr,i in enumerate(webcontent.findAll('div',{'jslog':'93789'})):

   if len(articles_list) == maxcnt: break   # exit outer loop

   for link in i.findAll('a', attrs={'href': re.compile("/articles/")},limit=1): 

       if any(keyword in i.select_one('h3').getText() for keyword in keyword_list): 

           articles_list.append((i.select_one('h3').getText(),"https://news.google.com"+str(link.get('href')))) 

           if len(articles_list) == maxcnt: break  # exit inner loop


print(str(len(articles_list)), 'articles')

print('\n'.join(['> '+a[0] for a in articles_list]))  # article titles

输出


5 articles

> Why Coronavirus Tests Come With Surprise Bills

> It’s Not Easy to Get a Coronavirus Test for a Child

> Britain’s health secretary says the asymptomatic don’t need tests. Critics say that sends a mixed message.

> Coronavirus testing shifts focus from precision to rapidity

> Coronavirus testing at Boston lab suspended after nearly 400 false positives


查看完整回答
反对 回复 2023-07-27
  • 1 回答
  • 0 关注
  • 89 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信