2012-11-21 75 views
2

我是python的新手,并试图编写一个scrapper来获取页面上的所有链接,具有多个分页。我在while循环中调用以下代码。Beautifulsoup在while循环中调用时返回相同的结果

page = urllib2.urlopen(givenurl,"",10000) 

soup = BeautifulSoup(page, "lxml") 

linktags = soup.findAll('span',attrs={'class':'paginationLink pageNum'}) 

page.close() 

BeautifulSoup.clear(soup) 

return linktags 

它总是返回第一个URL我传递的结果。难道我做错了什么?

+1

你能说明你是如何调用循环的吗?你确定这个网址是不同的吗? – jdi

+3

如果循环内有回车,它将不会迭代多次。 –

+0

@uncollected:我敢打赌你只是钉了它 – jdi

回答

5

@uncollected可能在评论中对您有正确的答案,但我想对其进行扩展。

如果您要求确切的代码,但嵌套在while块中,它将立即返回第一个结果。你可以在这里做两件事。

我不确定您在自己的环境中如何使用while,所以我在此处使用for循环。

扩展结果列表,并返回

def getLinks(urls): 
    """ processes all urls, and then returns all links """ 
    links = [] 
    for givenurl in urls: 
     page = urllib2.urlopen(givenurl,"",10000) 
     soup = BeautifulSoup(page, "lxml") 
     linktags = soup.findAll('span',attrs={'class':'paginationLink pageNum'}) 
     page.close() 
     BeautifulSoup.clear(soup) 
     links.extend(linktags) 
     # dont return here or the loop is over 

    return links 

或者,而不是返回的整个列表,你可以把它generator, using the yield keyword。生成器将返回每个结果并暂停,直到下一个循环:

def getLinks(urls): 
    """ generator yields links from one url at a time """ 
    for givenurl in urls: 
     page = urllib2.urlopen(givenurl,"",10000) 
     soup = BeautifulSoup(page, "lxml") 
     linktags = soup.findAll('span',attrs={'class':'paginationLink pageNum'}) 
     page.close() 
     BeautifulSoup.clear(soup) 
     # this will return the current results, 
     # and pause the state, until the the next 
     # iteration is requested  
     yield linktags