【问题标题】:Extract all data from a dynamic HTML table从动态 HTML 表中提取所有数据
【发布时间】:2018-11-15 03:43:15
【问题描述】:

这是我的问题:

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

但是

由于该表仅显示 20 行,因此我只能提取前 20 行而不是整个表(哪些行号非常随机)。

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

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

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

编辑 1:

这是 HTML(我已将其过滤为只有 col1,因为我需要提取数据)

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

确实,表格右侧有一个滚动选项卡,如此处的屏幕截图所示:

Table_screenshot

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

==> 第 2 行变成第 0 行,第 3 行变成第 1 行,...

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

谢谢大家,

阿诺

【问题讨论】:

  • 添加一些HTML和代码的细节
  • 页面链接会很有帮助。当您说向下滚动时,您是指向下滚动页面还是指切换到具有更多表格数据的另一个页面/面板?例如向下滚动时,是保留原始表格数据还是替换为新数据?

标签: python selenium web-scraping html-table


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    经过大量测试,答案如下:

     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
    

    【讨论】:

      猜你喜欢
      • 2020-10-17
      • 2021-01-05
      • 2016-02-01
      • 1970-01-01
      • 2012-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多