網站通過使用兩個日期過濾器(年/周)動態更改內容,而不需要獲取請求(它在客戶端異步處理)。每個過濾器選項都會生成一個與我想要提取的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元素時它都會增加,實際上我只希望它在迭代完成特定頁面源代碼時增加(這本身就是一個迭代過濾器組合)。
我很難過,我想甚至有可能嗎?如果是的話,我應該把櫃檯放在哪裏?或者我應該使用其他技術?
我沒有看到任何列表理解你的問題。對於當前的代碼(使用常規循環),只需爲每個過濾器組合創建並追加一個新的列表對象,然後將所有的'td'文本結果追加到新列表中:perfilter = []',store.append(perfilter) ',並在'find_all()'循環中:'perfilter.append(el.get_text())'。 –
我已更正對列表理解的參考 – abc