Python 从动态HTML表中提取所有数据
这是我的问题: 对于Excel编写应用程序,我从HTML表中提取数据。 我有一个包含表格的网站,我可以浏览它并提取数据 但是 由于表中只显示了20行,所以我只能提取前20行,而不能提取整个表(这些行号非常随机) 请注意,每次向下滚动时,HTML表都会将其td/ID从第0行重置为第19行(可能很常见,但我不是HTML专业人士:D) 我不知道如何在没有重复行数据的情况下遍历整个表 如果有人有主意,欢迎 编辑1: 这是HTML(我已经过滤了它,只有col1,因为我需要提取) 事实上,表格右侧有一个滚动选项卡,如屏幕截图所示: 当我在表格中向下滚动2次时,HTML会自动更新,如下所示: ==>第2行变为第0行,第3行变为第1行 我有大约100张表格要提取,我无法提前知道表格的长度 谢谢大家Python 从动态HTML表中提取所有数据,python,selenium,web-scraping,html-table,Python,Selenium,Web Scraping,Html Table,这是我的问题: 对于Excel编写应用程序,我从HTML表中提取数据。 我有一个包含表格的网站,我可以浏览它并提取数据 但是 由于表中只显示了20行,所以我只能提取前20行,而不能提取整个表(这些行号非常随机) 请注意,每次向下滚动时,HTML表都会将其td/ID从第0行重置为第19行(可能很常见,但我不是HTML专业人士:D) 我不知道如何在没有重复行数据的情况下遍历整个表 如果有人有主意,欢迎 编辑1: 这是HTML(我已经过滤了它,只有col1,因为我需要提取) 事实上,表格右侧有一个滚动
Arnaud使用xpath而不是td/id提取行,因为它们不是常量
单击“下一页”按钮,然后再次提取行,直到“下一页”按钮单击给出NotFoundException(取决于按钮在最后一页上是否不可见)。如果你提供HTML或网站链接,你会得到更好的答案 经过大量测试,以下是答案:
try:
last_row = driver.find_element_by_xpath(".//tr/*[contains(@id, '--TilesTable-rows-row19-col1')]")
last_row_old = driver.find_element_by_xpath(".//tr/*[contains(@id, '--TilesTable-rows-row19-col1')]").text
last_row.click()
last_row.send_keys(Keys.PAGE_DOWN)
time.sleep(2)
last_row_new = driver.find_element_by_xpath(".//tr/*[contains(@id, '--TilesTable-rows-row19-col1')]").text
while (last_row_new == last_row_old) is False:
table = driver.find_element_by_xpath("//*[contains(@id, '--TilesTable-table')]/tbody")
td_list = table.find_elements_by_xpath(".//tr/*[contains(@id, '-col1')]")
for td in td_list:
tile_title = td.text
sh_tile = wb["Tuiles"]
sh_tile.append([catalog, tile_title])
last_row = driver.find_element_by_xpath(".//tr/*[contains(@id, '--TilesTable-rows-row19-col1')]")
last_row_old = driver.find_element_by_xpath(".//tr/*[contains(@id, '--TilesTable-rows-row19-col1')]").text
last_row.click()
last_row.send_keys(Keys.PAGE_DOWN)
time.sleep(0.5)
last_row_new = driver.find_element_by_xpath(".//tr/*[contains(@id, '--TilesTable-rows-row19-col1')]").text
except selenium.common.exceptions.NoSuchElementException:
pass
添加一些HTML和代码的细节链接到页面将非常有用。当你说向下滚动时,你是指向下滚动页面,还是指切换到另一个包含更多表格数据的页面/面板?e、 g.向下滚动时,原始表格数据是否保留,还是用新数据替换?
try:
last_row = driver.find_element_by_xpath(".//tr/*[contains(@id, '--TilesTable-rows-row19-col1')]")
last_row_old = driver.find_element_by_xpath(".//tr/*[contains(@id, '--TilesTable-rows-row19-col1')]").text
last_row.click()
last_row.send_keys(Keys.PAGE_DOWN)
time.sleep(2)
last_row_new = driver.find_element_by_xpath(".//tr/*[contains(@id, '--TilesTable-rows-row19-col1')]").text
while (last_row_new == last_row_old) is False:
table = driver.find_element_by_xpath("//*[contains(@id, '--TilesTable-table')]/tbody")
td_list = table.find_elements_by_xpath(".//tr/*[contains(@id, '-col1')]")
for td in td_list:
tile_title = td.text
sh_tile = wb["Tuiles"]
sh_tile.append([catalog, tile_title])
last_row = driver.find_element_by_xpath(".//tr/*[contains(@id, '--TilesTable-rows-row19-col1')]")
last_row_old = driver.find_element_by_xpath(".//tr/*[contains(@id, '--TilesTable-rows-row19-col1')]").text
last_row.click()
last_row.send_keys(Keys.PAGE_DOWN)
time.sleep(0.5)
last_row_new = driver.find_element_by_xpath(".//tr/*[contains(@id, '--TilesTable-rows-row19-col1')]").text
except selenium.common.exceptions.NoSuchElementException:
pass