Python Web Scratching-只查找n项



我正在运行一个用Beautiful Soup制作的抓取脚本。我从谷歌新闻中抓取结果,我只想获得作为元组添加到变量中的前n个结果。元组由新闻标题和新闻链接组成。在完整的脚本中,我有一个关键词列表,比如"危机"、"金融"等等,你可以忽略这一部分。这就是密码。

import bs4,requests
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') 

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循环的一部分,并且变量articleslist是全局的,因此它也停止为抓取的下一个对象追加。

最后我尝试了:

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无论如何都会包含比我需要的更多的元素。

你能帮我理解我缺了什么吗?

谢谢!

您的代码中有一个双循环。要退出这两个循环,需要使用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

最新更新