网站通过使用两个日期过滤器(年/周)动态更改内容,而无需获取请求(在客户端进行异步处理)。每个过滤器选项都会生成一个不同的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元素时它都会增加,而实际上我只想在迭代完一个特定的页面源(这本身就是迭代)时增加它过滤器组合)。
我很难过,我正在尝试甚至可能吗?如果是的话,我应该把柜台放在哪里?或者我应该使用其他技术吗?
答案 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())