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.
Das ist genial! Viel schneller als der ältere Code. Danke – Abdur
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
Die einfachste Möglichkeit ist es, die br-Tags durch Zeilenumbrüche zu ersetzen, was col schließlich mit kombiniertem Text endet? –