网站通过使用两个日期过滤器(年/周)动态更改内容,而无需获取请求(在客户端异步处理)。每个过滤器选项都会生成一个包含要提取的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元素的单个列表。
相反,我想在列表列表中存储单独的列表,每个页面源一个列表(即每个过滤器组合一个)。我可以在事实完成后做到这一点,即在第二步中,我可以根据一些条件从列表中提取项目。
但是,我可以在原始添加时执行此操作吗?就像是...
store = [[],[], [], []]
...
counter = 0
for el in soup.find_all('td'):
store[counter].append(el.get_text())
counter = counter +1
这并不完全正确,因为它仅追加到商店列表中的第一个对象。如果我将计数器放在td for循环中,则每次td元素被迭代时,计数器都会增加,而实际上我只希望在完成对特定页面源的迭代后才增加计数器(它本身就是一个迭代)过滤器组合)。
我很沮丧,我正在尝试的可能吗?如果是这样,我应该把柜台放在哪里?还是我应该使用其他技术?
为每个过滤器组合创建一个新的列表对象,因此在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())
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句