【发布时间】: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()). -
我已经更正了对列表理解的引用