2016-05-12 15 views
1

NYSEのウェブサイトから株価を削っています。例えば、page for IBMには、に対応するフィールドを削り取りたいと思います。の中からデータグリッドの中から最後の価格を削りました。私はこのグリッドがreact.jsを使って生成されると信じています。私のブラウザで開発者向けのツールで、私は必要なデータを見つけることができます。 React.jsデータグリッドからデータをスクラップできません

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

だからとページが完全に domid="LastPrice"とのスパンを検索することが可能なはずであるロード。しかし、私は計画的にグリッドを読み込むことはできません。この作業で素朴なスクレイパーが失敗するのは特に驚くべきことではありませんが、PhantomJSとFirefoxの両方をセレンを使って使用することにも問題がありました。たとえば、以下のコードでは、グリッド外のDOM要素を見つけることができますが、 <span> 内にはのグリッドが見つかりません。奇妙なのは、実際にfirefoxウィンドウ(セレンで開く)に読み込まれたグリッドを見ることができるということですが、読み込んだ後でもプログラム的に到達可能ではないようです。

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を実行する必要がありますか?

答えて

2

希望のスパン要素はiframeに配置されています。つまり、span要素を直接見つけることはできません。これにアクセスするには、最初にウェブドライバオブジェクトに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 
+0

広告のとおりに動作します。ありがとうリーバイス! – user41140

関連する問題