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

时间:2018-06-05 15:24:10

标签: python selenium web-scraping html-table

这是我的问题:

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

BUT

因为该表只显示了20行,所以我只能提取前20行而不是整个表(哪些行号非常随机)。

请注意,每次向下滚动时,HTML表都将他的td / ID重置为row0到row19(可能通常但我不是HTML专家:D)

我不知道如何在没有重复行数据的情况下浏览整个表格。

如果有人有想法,欢迎你!

编辑1:

这是HTML(我已将其过滤为只有我需要的col1)

`https://jsfiddle.net/yfb429Lo/13/`

事实上,桌子右侧有一个滚动标签,如屏幕截图所示:

Table_screenshot

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

==> row2变为row0,row3变为row1,...

我有100个表要提取,我无法通过提前知道表长度。

全心全意,

阿诺

2 个答案:

答案 0 :(得分:0)

使用xpath而不是td / ID提取行,因为它们不是常量。

单击下一页按钮,然后再次提取行,直到下一页按钮单击为您提供NotFoundException(取决于该按钮在最后一页上不可见)。如果您提供HTML或网站链接,您将获得更好的答案。

答案 1 :(得分:0)

经过大量测试后,答案就是:

 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