2013-05-09 111 views
0

我是新来的蟒蛇。有没有办法来简化这一点:我觉得我应该可以改为建立getDivs的匿名函数简化这个蟒蛇代

def getDivs(): 
    divs = soup.findAll(name = "div", attrs = {"class" : "resultCell"}, recursive = True) 
    for div in divs: 
     h2 = div.find("h2") 
     a = h2.find("a") 
     href = a["href"] 
     yield (href) 

divs = list(getDivs()) 

。类似的信息(伪):

divs = 

    [ 
    divs = soup.findAll(name = "div", attrs = {"class" : "resultCell"}, recursive = True) 
    for div in divs: 
     h2 = div.find("h2") 
     a = h2.find("a") 
     href = a["href"] 
     yield (href) 
    ] 

感谢

+1

使用'lxml'和'xpath':P应该为你提供一个oneliner ... – root 2013-05-09 13:27:19

回答

3

只需用一个列表理解:

divs = [ div.find("h2").find("a")["href"] 
      for div in soup.findAll(name = "div", 
            attrs = {"class" : "resultCell"}, 
            recursive = True) ] 

但是使用合适的XML解析工具是一个更好的主意。

+0

你删除了内部的“divs”变量。我不确定这是否足够普遍。例如,在您的解决方案中,soup.findAll()会评估多少次? – seguso 2013-05-09 13:44:06

+1

@seguso'soup.findAll()'将被评估的次数与它在代码中的次数相同。上面的代码等同于您的代码。 – Aleph 2013-05-09 13:47:27

+0

谢谢。 是否有一些解决方案允许保留中间变量h2,a,href?像列表(lambda(...))? – seguso 2013-05-09 13:48:28