从动态HTML选项卡中提取所有数据

2024-04-23 09:15:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我的问题是:

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

但是

由于表中只显示了20行,所以我只能提取前20行,而不能提取整个表(行号是非常随机的)。你知道吗

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

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

如果有人有主意,欢迎!你知道吗

编辑1:

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

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

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

Table_screenshot

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

==>;第2行变成第0行,第3行变成第1行。。。你知道吗

我有大约100张表要提取,我不能提前知道表的长度。你知道吗

谢谢大家

阿诺


Tags: 数据id应用程序编辑网站html情况excel
2条回答

使用xpath而不是td/IDs提取行,因为它们不是常量。你知道吗

单击next page按钮,然后再次提取行,直到next page按钮Click给出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

相关问题 更多 >