【问题标题】:Extracting element from table using selenium web scraping使用 selenium web 抓取从表中提取元素
【发布时间】:2022-02-07 04:57:05
【问题描述】:

我正在尝试使用 selenium 从网站上抓取表格, 但是,数据似乎被压缩到一列而不是两个单独的列中; DateValue- 非常感谢您的帮助 - 现在已修改以包括进一步改进

driver.get("https://www.multpl.com/shiller-pe/table/by-year/")

table_trs = driver.find_elements(By.XPATH, '//table[@id="datatable"]/tbody/tr')

value_list = []
for v in range(len(table_trs )):
    value_list.append(table_trs [v].text)

print(value_list)
df = pd.DataFrame(value_list)

我要抓取的表格在网站上显示如下......

..以及与之关联的html部分.....

【问题讨论】:

  • 你为抓取它而编写的代码在哪里?
  • 我已更新问题以显示我使用的代码

标签: python html selenium web-scraping


【解决方案1】:

注意: 答案侧重于 xpath 的正确使用,并且仅基于您的屏幕截图 - 改进您的问题并将代码和示例作为文本发布将生成更具体的答案

要通过xpath获取表的<tr>s,请将其更改为//table[@id="datatable"]/tbody/tr

from selenium.webdriver.common.by import By

table_trs = driver.find_elements(By.XPATH, '//table[@id="datatable"]/tbody/tr')

编辑

根据您的改进,您可以使用pandas.read_html() 将表格直接转换为数据框。只需重命名列,因为<th> 中有两个跨度标记将导致列名“值值”:

driver.get("https://www.multpl.com/shiller-pe/table/by-year/")

df = pd.read_html(driver.page_source)[0]
df.columns = ['Date','Value']

作为替代方案,您可以像这样迭代:

driver.get("https://www.multpl.com/shiller-pe/table/by-year/")

table_trs = driver.find_elements(By.XPATH, '//table[@id="datatable"]/tbody/tr')
value_list = []
for row in table_trs[1:]:
    value_list.append({
        'Date':row.find_elements(By.TAG_NAME, "td")[0].text,
        'Value':row.find_elements(By.TAG_NAME, "td")[1].text
    })

df = pd.DataFrame(value_list)

输出

Date Value
Feb 4, 2022 37.18
Jan 1, 2022 39.63
Jan 1, 2021 34.51
Jan 1, 2020 30.99
Jan 1, 2019 28.38
Jan 1, 2018 33.31
Jan 1, 2017 28.06
Jan 1, 2016 24.21
Jan 1, 2015 26.49
... ...

【讨论】:

  • 谢谢,但这提供了一个非常奇怪的输出......[<selenium.webdriver.remote.webelement.WebElement (session=.......
  • 这是您必须迭代的 trs 的结果集 - 如前所述,改进您的问题将导致更具体的答案。
  • 现在添加迭代并转换为df,但无法拆分单列
  • 感谢您的更新 - 我在答案中添加了一个编辑,看看并试一试。
  • 结果完全符合我的期望 - 谢谢!!!
【解决方案2】:

这里缺少某些东西,或者您输入了错误的 xpath。 有效的 xpath 将是(基于图片)"//div[@id="datatable"]/tbody/tr",但这只会给你行。您可以通过获取所有行数和列进行迭代,例如//div[@id="datatable"]/tbody/tr[i]/td[j],然后从每个元素获取文本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-15
    • 1970-01-01
    • 2019-02-16
    • 2021-09-16
    • 1970-01-01
    • 2021-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多