陷入嵌套for循环问题

时间:2016-09-16 15:40:30

标签: python for-loop

网站通过使用两个日期过滤器(年/周)动态更改内容,而无需获取请求(在客户端进行异步处理)。每个过滤器选项都会生成一个不同的page_source,其中包含我想要提取的td元素。

目前,我使用嵌套列表for循环来遍历过滤器(因此不同的页面源包含不同的td元素,遍历每个页面源的内容,然后将所需的td元素附加到空列表中。

store = []

def getData():
    year = ['2015','2014']


    for y in year:
        values = y
        yearid = Select(browser.find_element_by_id('yearid'))
        fsid.select_by_value(values)


        weeks = ['1', '2']
        for w in weeks:
            value = w           
            frange = Select(browser.find_element_by_id('frange'))
            frange.select_by_value('WEEKS')
            selectElement = Select(browser.find_element_by_id('fweek'))
            selectElement.select_by_value(value)
            pressFilter = browser.find_element_by_name('submit')
            pressFilter.submit()

            #scrape data from page source 

            html = browser.page_source

            soup = BeautifulSoup(html, "lxml")


            for el in soup.find_all('td'):
                store.append(el.get_text())

到目前为止一直很好,我有一个for循环,它构造了我想要的所有td元素的单个列表。

相反,我想在列表列表中存储单独的列表,每个页面源一个(即每个过滤器组合一个)。我可以在事实之后这样做,即在第二步中我可以根据某些标准从列表中提取项目。

但是,我可以在原始附加点处这样做吗?有点像...

store = [[],[], [], []]

...

   counter = 0
   for el in soup.find_all('td'):
      store[counter].append(el.get_text())
   counter = counter +1 

这不是很正确,因为它只附加到商店列表中的第一个对象。如果我把计数器放在td for循环中,那么每次迭代td元素时它都会增加,而实际上我只想在迭代完一个特定的页面源(这本身就是迭代)时增加它过滤器组合)。

我很难过,我正在尝试甚至可能吗?如果是的话,我应该把柜台放在哪里?或者我应该使用其他技术吗?

1 个答案:

答案 0 :(得分:1)

为每个过滤器组合创建一个新的列表对象,因此在for w in weeks:循环内。将您的单元格文本附加到那个列表,并将生成的每个过滤器列表附加到store

def getData():
    store = []
    year = ['2015','2014']

    for y in year:
        # ... elided for brevity    

        weeks = ['1', '2']
        for w in weeks:
            perfilter = []
            store.append(perfilter)

            # ... elided for brevity    

            for el in soup.find_all('td'):
                perfilter.append(el.get_text())