【问题标题】:How should I properly use Selenium我应该如何正确使用 Selenium
【发布时间】:2016-08-03 00:27:06
【问题描述】:

我想从雅虎财经 (http://finance.yahoo.com/quote/AAPL/financials?p=AAPL) 获得一个数字,资产负债表,总股东权益。如果我检查元素,我会得到:

<span data-reactid=".1doxyl2xoso.1.$0.0.0.3.1.$main-0-Quote-Proxy.$main-0-Quote.0.2.0.2:1:$BALANCE_SHEET.0.0.$TOTAL_STOCKHOLDER_EQUITY.1:$0.0.0">119,355,000</span>

我想得到,报废号码:119,355,000。

如果我理解正确,网页是用 Java Script 编码的,我需要使用 Selenium 来获得所需的数字。无论我做什么,我的尝试(我是一个完整的初学者)都不起作用,贝娄是许多尝试中的三个。我尝试使用'data-reactid'和其他一些东西,但我的想法已经用完了:-)

elem = Browser.find_element_by_partial_link_text('TOTAL_STOCKHOLDER_EQUITY')
elem = browser.find_element_by_id('TOTAL_STOCKHOLDER_EQUITY') 
elem = browser.find_elem_by_id('TOTAL_STOCKHOLDER_EQUITY')

【问题讨论】:

  • 您知道,有一个yahoo-finance python 包。您不需要编写自己的刮板
  • cricket_007,我也会调查一下,谢谢你提到它,但作为一个完全的菜鸟,我可能会再挣扎一周或更长时间。在这里,我现在“非常”接近最终得到结果。我只需要那一行代码:-)

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


【解决方案1】:

实际上您的所有定位器看起来无效,请尝试使用find_element_by_css_selector,如下所示:-

elem = browser.find_element_by_css_selector("span[data-reactid *= 'TOTAL_STOCKHOLDER_EQUITY']")

注意:find_element_by_partial_text 仅用于定位 a,其文本内容部分匹配而不是其属性文本,find_element_by_id 用于定位具有其 id 属性的任何元素,该属性将与传递值完全匹配。

已编辑 :- 使用提供的定位器找到了更多元素,因此您应该尝试找到 Total Stockholder Equity 表示 tr 元素的确切行,然后找到它们的所有 td 元素,如下所示:-

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

browser = webdriver.Chrome()
browser.get('http://finance.yahoo.com/quote/AAPL/financials?p=AAPL')
browser.maximize_window()

wait = WebDriverWait(browser, 5) 

    try:
        #first try to find balance sheet link and click on it
        balanceSheet = wait.until(EC.element_to_be_clickable((By.XPATH, "//span[text() = 'Balance Sheet']")))
        balanceSheet.click() 

        #Now find the row element of Total Stockholder Equity
        totalStockRow = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "tr[data-reactid *= 'TOTAL_STOCKHOLDER_EQUITY']")))

        #Now find all the columns included with Total Stockholder Equity
        totalColumns = totalStockRow.find_elements_by_tag_name("td")

        #Now if you want to print single value just pass the index into totalColumns other wise print all values in the loop

        #Now print all values in the loop
        for elem in totalColumns:
             print elem.text
             #it will print value as 
             #Total Stockholder Equity
             #119,355,000
             #111,547,000
             #123,549,000
    except:
        print('Was not able to find the element with that name.')

希望对你有帮助...:)

【讨论】:

  • 非常感谢!现在我知道哪个是适合这项工作的选择器和定位器。我想我都试过了,但语法不正确。我可以再问你一件事吗?我正在使用书中的代码:Automate Boring Stuff 和原始代码有效,但我无法从 Yahoo 网站获取 TOTAL_STOCKHOLDER_EQUITY。这是我的短代码和您的更正:Ups I'm out of characters I will post code in next msg
  • @AL 正如我在您提供的网站中看到的那样,定位器span[data-reactid *= 'TOTAL_STOCKHOLDER_EQUITY'] 的元素不止一个。所以它总是会给你第一个..
  • 是的,我使用了您的代码,但它仍然会触发异常。我一定犯了其他错误。但原始代码有效。只有 Yahoo 引起了问题,可能是因为 Java Script。代码真的很短,如果你可以在你的电脑上查看它,我刚刚发布了整个代码?不过,不要着急。
  • @Al_ 好的,我已经为您提供了带有编辑答案的工作示例,请尝试并告诉我..:)
  • 谢谢,谢谢,谢谢,你让我开心!!!我不得不稍微更改代码,没有使用等待,所以我搜索了互联网并将 Wait 更改为 WebDriverWait 直到我仍然没有点击资产负债表更改为:balanceSheet = WebDriverWait(browser, 5) 现在它正在工作,我学到了很多东西,现在我可以开始处理我的项目并在此过程中学习编码。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-02
  • 2021-12-03
  • 2013-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多