【问题标题】:Stuck with nested for loop issue陷入嵌套 for 循环问题
【发布时间】:2016-09-16 15:40:29
【问题描述】:

网站通过使用两个日期过滤器(年/周)动态更改内容,无需获取请求(在客户端异步处理)。每个过滤器选项都会生成一个不同的 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 元素时它都会增加,而实际上我只希望它在我完成对特定页面源的迭代后增加(这本身就是一次迭代过滤器组合)。

我很困惑,我正在尝试的东西可能吗?如果是这样,我应该把柜台放在哪里?还是我应该使用其他技术?

【问题讨论】:

  • 我在您的问题中看不到任何列表理解。对于您当前的代码(使用常规循环),只需为每个过滤器组合创建并附加一个新列表对象,并将所有 td 文本结果附加到该新列表:perfilter = []store.append(perfilter)find_all()循环:perfilter.append(el.get_text()).
  • 我已经更正了对列表理解的引用

标签: python for-loop


【解决方案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())

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多