Python 从动态HTML表中提取所有数据

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,因为我需要提取) 事实上,表格右侧有一个滚动

这是我的问题:

对于Excel编写应用程序,我从HTML表中提取数据。 我有一个包含表格的网站,我可以浏览它并提取数据

但是

由于表中只显示了20行,所以我只能提取前20行,而不能提取整个表(这些行号非常随机)

请注意,每次向下滚动时,HTML表都会将其td/ID从第0行重置为第19行(可能很常见,但我不是HTML专业人士:D)

我不知道如何在没有重复行数据的情况下遍历整个表

如果有人有主意,欢迎

编辑1:

这是HTML(我已经过滤了它,只有col1,因为我需要提取)

事实上,表格右侧有一个滚动选项卡,如屏幕截图所示:

当我在表格中向下滚动2次时,HTML会自动更新,如下所示:

==>第2行变为第0行,第3行变为第1行

我有大约100张表格要提取,我无法提前知道表格的长度

谢谢大家


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