2013-05-09 2 views
0

Я новичок в python. Есть ли способ, чтобы упростить это:упростить это поколение python

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()) 

Я чувствую, что я должен быть в состоянии создать анонимную функцию вместо 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

ответ

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

+1

@seguso 'soup.findAll()' будет оцениваться столько раз, сколько в вашем коде. Вышеприведенный код эквивалентен вашему коду. – Aleph

+0

спасибо. Есть ли какое-то решение, позволяющее сохранить промежуточные переменные h2, a, href? что-то вроде списка (лямбда (...))? – seguso

Смежные вопросы