无法从网页中抓取表格中的数据

时间:2017-08-01 12:17:49

标签: python python-3.x selenium selenium-webdriver web-scraping

我已经在python中编写了一个与selenium结合使用的脚本来从位于网页(finance.yahoo)中的某个表中获取数据。但是,当我执行它时,我收到一个错误。我无法确定我是否有任何错误。 FYC,我到目前为止所写的内容都粘贴在下面。

脚本我尝试用:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()

driver.get("https://finance.yahoo.com/")
wait = WebDriverWait(driver, 10)

wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "table.tbl tbody")))
items = driver.find_element_by_css_selector("table.tbl tbody")
list_of_data = [[item.text for item in data.find_elements_by_css_selector('td')]
                    for data in items.find_elements_by_css_selector('tr')]
for tab_data in list_of_data:
    print(tab_data) 

driver.quit()

我的脚本抛出的错误:

line 80, in until
    raise TimeoutException(message, screen, stacktrace)
selenium.common.exceptions.TimeoutException: Message: 

表格数据所在元素的部分部分:

<table cellspacing="0" cellpadding="0" border="0" width="100%" class="tbl">
                <tbody>
                    <tr><th class="pr">Loan Type</th><th class="rate">Today</th><th class="ch">Change</th><th class="lw">Last&nbsp;Week</th></tr>
                    <tr class="">
                        <td class="pr"><a target="_top" rel="nofollow" href="https://finance.yahoo.com/rates">30 yr fixed</a></td>
                        <td class="rate">3.82%</td>
                        <td class="ch"><div class="arrow-up"></div></td>
                        <td class="lw">3.80%</td>
                    </tr>
                    <tr class="bk ">
                        <td class="pr"><a target="_top" rel="nofollow" href="https://finance.yahoo.com/rates/mortgage/15-year-fixed">15 yr fixed</a></td>
                        <td class="rate">3.01%</td>
                        <td class="ch"><div class="arrow-down"></div></td>
                        <td class="lw">3.05%</td>
                    </tr>
                </tbody>
            </table>

2 个答案:

答案 0 :(得分:1)

以下是您的问题的答案:

查看您提供的HTML,我假设您正在尝试删除表格标题为<{1}},Rates,{{{strong> Loan Type 的表格。 1}}和Today。但我仍然不确定您希望废弃数据的格式。

Change 表位于Last Week范围内,名称为 Rates 。所以我们需要先切换到框架,然后刮掉桌子。以下是使用您的报废逻辑更改 iframe 表的工作代码块:

bankrate-overnight-average

我的控制台上的输出显示为:

Rates

如果这回答你的问题,请告诉我。

答案 1 :(得分:0)

我访问了url并检查了页面元素,并且没有tableName的className为'tbl',这就是驱动程序无法找到元素和超时的原因。只需尝试从以下行中删除.tbl:

wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "table.tbl tbody")))
items = driver.find_element_by_css_selector("table.tbl tbody")

此外,由于项目是列表对象,因此find_elements_by_css_selector()方法将不适用于此,因此您可能会收到错误。