2016-09-16 332 views
0

網站通過使用兩個日期過濾器(年/周)動態更改內容,而不需要獲取請求(它在客戶端異步處理)。每個過濾器選項都會生成一個與我想要提取的td元素不同的page_source。嵌套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元素的一個列表,我想。

相反,我想用來存儲單獨的列表,一個用於每個頁面源(即每個過濾器組合的一個),列表中的一個列表中,我可以做到這一點,即在第二步中,我可以ld然後根據一些標準從列表中提取項目。

但是,我可以在原始附加點上做到這一點嗎?像...

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

... 

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

這是不完全正確的,因爲它只附加到商店列表中的第一個對象。如果我把計數器放在td for-loop中,那麼每次迭代td元素時它都會增加,實際上我只希望它在迭代完成特定頁面源代碼時增加(這本身就是一個迭代過濾器組合)。

我很難過,我想甚至有可能嗎?如果是的話,我應該把櫃檯放在哪裏?或者我應該使用其他技術?

+1

我沒有看到任何列表理解你的問題。對於當前的代碼(使用常規循環),只需爲每個過濾器組合創建並追加一個新的列表對象,然後將所有的'td'文本結果追加到新列表中:perfilter = []',store.append(perfilter) ',並在'find_all()'循環中:'perfilter.append(el.get_text())'。 –

+0

我已更正對列表理解的參考 – abc

回答

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