无法从React.js数据网格中抓取数据

时间:2016-05-12 12:35:17

标签: python selenium reactjs

我试图从纽约证券交易所网站上榨取股票价格。例如,在page for IBM上,我想从 Quote 数据网格中删除与 Last Price 对应的字段。我相信这个网格是使用react.js生成的。使用浏览器中的开发人员工具,我可以找到所需的数据:

<span class="rtq-d big" domid="LastPrice">148.95</span> 

因此,在页面完全加载的情况下,应该可以使用domid="LastPrice"搜索范围。但我似乎无法以编程方式加载网格。天真的刮刀在这项任务中失败并不特别令人惊讶,但我也很难通过硒使用PhantomJS和Firefox。例如,下面的代码表明虽然可以在网格外找到DOM元素,但无法找到网格中所需的<span> 。奇怪的是,我实际上可以看到firefox窗口中加载的网格(由selenium打开),但即使在加载后,它似乎也无法以编程方式访问。

In [1]: from selenium import webdriver

In [2]: driver = webdriver.Firefox()

In [3]: driver.get('http://www.nyse.com/quote/XNYS:IBM')

In [4]: driver.find_element_by_xpath('//div[@id="content-1500013182"]')  # outside grid
Out[4]: <selenium.webdriver.remote.webelement.WebElement (session="a67fa410-8033-472a-8932-ccc40ef026a3", element="{61a9aded-1b9d-4995-9a74-031c3cff5e55}")>

In [5]: driver.find_element_by_xpath('//span[@domid="LastPrice"]')       # inside grid
Out[5]: NoSuchElementException: Message: Unable to locate element: {"method":"xpath","selector":"//span[@domid=\"LastPrice\"]"}

我是否遗漏了某种咒语,将硒驱动程序与页面上实际加载的内容同步?或者我是否需要从驱动程序运行一些javascript以确保正确加载该页面?

1 个答案:

答案 0 :(得分:2)

您想要的span元素位于iframe中,这意味着无法直接找到span元素。要访问它,您必须先指示webdriver对象切换到iframe:

iframes = driver.find_elements_by_xpath("//div[@class='panel-body']//iframe")
len(iframes)  # 5
driver.switch_to.frame(iframes[0])
driver.find_element_by_xpath('//span[@domid="LastPrice"]')  # should work now