2016-06-09 8 views
1

Ich versuche, eine Tabelle von einer Site zu extrahieren, die den folgenden Code verwendet (Höflichkeit: Padraic). Wenn ich diesen Code ausführe, wird er ausgeführt und beendet nichts und gibt nichts zurück, wenn er nicht beendet wird.Tabellenextraktion mit Selenium und PhantomJS beendet nie

from selenium import webdriver 

import pandas as pd 

dr = webdriver.PhantomJS(r'C:\Users\Admin\Anaconda3\phantomjs-2.1.1-windows\bin\phantomjs.exe') 

elements=[] 

url='http://www.moneycontrol.com/stocks/fno/marketstats/options/active_calls/index.php' 


dr.get(url) 
table = dr.find_element_by_css_selector("div.MT15") 

for row in table.find_elements_by_xpath(".//tr"): 
     elem=(":".join([td.text.replace("\n","") for td in \ 
     row.find_elements_by_xpath(".//td")])) 
     element= elem.split(":") 
     elements.append(element) 

print (elements) 

Antwort

2

Wenn Sie eine print(row) in der Schleife hinzugefügt haben, können Sie eine Ausgabe wie:

<selenium.webdriver.remote.webelement.WebElement (session="10676710-2e8c-11e6-b13a-473272d23fd8", element=":wdc:1465509003017")> 
<selenium.webdriver.remote.webelement.WebElement (session="10676710-2e8c-11e6-b13a-473272d23fd8", element=":wdc:1465509003018")> 
<selenium.webdriver.remote.webelement.WebElement (session="10676710-2e8c-11e6-b13a-473272d23fd8", element=":wdc:1465509003019")> 
<selenium.webdriver.remote.webelement.WebElement (session="10676710-2e8c-11e6-b13a-473272d23fd8", element=":wdc:1465509003020")> 
<selenium.webdriver.remote.webelement.WebElement (session="10676710-2e8c-11e6-b13a-473272d23fd8", element=":wdc:1465509003021")> 
<selenium.webdriver.remote.webelement.WebElement (session="10676710-2e8c-11e6-b13a-473272d23fd8", element=":wdc:1465509003022")> 
<selenium.webdriver.remote.webelement.WebElement (session="10676710-2e8c-11e6-b13a-473272d23fd8", element=":wdc:1465509003023")> 
<selenium.webdriver.remote.webelement.WebElement (session="10676710-2e8c-11e6-b13a-473272d23fd8", element=":wdc:1465509003024")> 
<selenium.webdriver.remote.webelement.WebElement (session="10676710-2e8c-11e6-b13a-473272d23fd8", element=":wdc:1465509003025")> 
<selenium.webdriver.remote.webelement.WebElement (session="10676710-2e8c-11e6-b13a-473272d23fd8", element=":wdc:1465509003026")> 

Es gibt ~ 1600tr Tags in der Quelle, von denen die meisten in den div sind Sie suchen also, deshalb scheint es für eine lange Zeit zu schleifen. Der Code funktioniert, es wird nur eine Weile dauern.

Sie läuft auch dies in einem Bruchteil der Zeit finden könnte, ist es in etwa einer Sekunde auf meinem Laptop ergänzt:

import requests 
from bs4 import BeautifulSoup, Tag 
r = requests.get(url) 
soup = BeautifulSoup(r.content, "lxml") 

table = soup.select_one("table.tblList") 
cols = [th.text for th in table.select_one("tr") if isinstance(th, Tag)] 
print(cols) 

elems = [[td.text for td in row if isinstance(td, Tag)] for row in table.select("tr + tr")] 

print(elems) 

Wenn wir den Code ausführen:

In [13]: import requests 

In [14]: from bs4 import BeautifulSoup, Tag 

In [15]: url = 'http://www.moneycontrol.com/stocks/fno/marketstats/options/active_calls/index.php' 

In [16]: r = requests.get(url) 

In [17]: soup = BeautifulSoup(r.content, "lxml") 

In [18]: table = soup.select_one("table.tblList") 

In [19]: cols = [th.text.strip() for th in table.select_one("tr") if isinstance(th, Tag)] 

In [20]: print(cols) 
[u'Symbol', u'Expiry\n Date', u'Option Type', u'Strike Price', u'LastPrice', u'Change\n \t\t\t\t\t\t\t\tChg%', u'High\n Low', u'Shares', u'Contracts', u'Value (Rs. Lakh)', u'Open Interest', u'Open Int Chg'] 

In [21]: elems = [[td.text.strip() for td in row if isinstance(td, Tag)] for row in table.select("tr + tr")] 

In [22]: print(elems[0]) 
[u'IFCI', u'30-Jun-16', u'CE', u'27.50', u'0.50', u'0.25100.00%', u'0.650.20', u'18,760,000', u'938', u'90.05', u'6,000,000', u'2,520,00072.41%'] 

In [23]: print(elems[-1]) 
[u'EICHERMOT', u'30-Jun-16', u'CE', u'20,800.00', u'30.00', u'-30.00-50.00%', u'30.0030.00', u'25', u'1', u'0.01', u'225', u'00.00%'] 

In [24]: len(elems) 
Out[24]: 1585 

Sie können sehen, Es gibt 1585 Zeilen in der Tabelle. Ich habe nur die erste und letzte Zeile ausgegeben, da es viel zu viele Daten zum Posten gibt, aber es bekommt die volle Tabelle für dich.

+0

Das ist genial! Viel schneller als der ältere Code. Danke – Abdur

+0

Eine kurze Frage ... innerhalb der td-Tags gibt es ein span-Tag, in dem es eine br gibt. Ohne diese Unterbrechung werden die Werte miteinander verkettet. kann ein anderes für verschachtelt werden, um den einzelnen td Text in zwei basierend auf dem
zu zerlegen. Danke – Abdur

+0

Die einfachste Möglichkeit ist es, die br-Tags durch Zeilenumbrüche zu ersetzen, was col schließlich mit kombiniertem Text endet? –