2016-07-22 23 views
-1

Ich versuche, die Tabelle von Morningstar in Pandas zu bekommenExtrahieren von Tabellen von der Website

Link zur Website - http://financials.morningstar.com/cash-flow/cf.html?t=3IINFOTECH&region=ind&culture=en-US

Da die Website ist Javascript, ich bin die Website in meinem lokalen Browser ersten Selen mit Rendering und dann die gerenderte HTML-Datei vom Browser lesen und versuchen, die Tabelle zu lesen.

Das Problem ist, dass die Tabelle in einem Div-Stil wie folgt gespeichert ist: das bedeutet, dass ich die Tabelle nicht lesen kann, entweder Pandas lesen HTML oder schöne Suppen Lesetabellenfunktionen. Beide geben den Fehler no tables found. Kann jemand mir mit einer einfachen Weise helfen, die Daten von den Div-Knoten zu extrahieren, da ich zu Python neu bin. Unten ist ein Teil des HTML-Skript für die Tabelle

"" style="overflow:hidden;white-space: nowrap;"> 
     25,875 
     </div> 
     <div class="pos column6Width109px" id="Y_2" rawvalue="16810200000" style="overflow:hidden;white-space: nowrap;"> 
     16,810 
     </div> 
     <div class="pos column6Width109px" id="Y_3" rawvalue="13113600000" style="overflow:hidden;white-space: nowrap;"> 
     13,114" 
+2

Kannst du zumindest posten, was du probiert hast? Warum posten Sie nicht Ihren BeautifulSoup-Code? Zeigen Sie den Fehler - das hilft uns wirklich dabei, Ihnen zu helfen. Veröffentliche auch das gesamte div-Tag, damit die Leute dir helfen können. Eine einzelne Zeile wird nicht helfen. Verwenden Sie 4 Leerzeichen, bevor Sie jede Zeile als Code formatieren. –

Antwort

0

Sie können die Daten erhalten mit nur Anfragen und BeautifulSoup wird der HTML-Code mit einem Ajax-Aufruf Introduction:

from bs4 import BeautifulSoup 
from json import loads 

import requests 
from time import time 

params = {'columnYear': '5', 'region': 'ind', 'rounding': '3', 'period': '12', 
      'curYearPart': '1st5year', 'culture': 'en-US', 'reportType': 'cf', 't': 'XNSE:3IINFOTECH', 
      'callback': 'jsonp{}'.format(str(int(time()))), 'order': 'asc', '_': str(int(time()))} 
r = requests.get('http://financials.morningstar.com/ajax/ReportProcess4HtmlAjax.html', params=params) 

cont = r.content 

jsn = loads(cont[cont.find("{"):cont.rfind("}") + 1]) 
soup = BeautifulSoup(jsn["result"]) 

table = soup.select_one("div.r_xcmenu.rf_table") 
headers = [d.text for d in table.select("div.rf_header [id^=Y_]")] 
print headers 
for row in table.find_all("div","rf_crow", style=False): 
    print([d.text for d in row.select("[id^=Y_]")]) 

Welche Sie gibt:

[u'2011-03', u'2012-03', u'2013-03', u'2014-03', u'2015-03', u'TTM'] 
[u'3,511', u'(1,545)', u'495', u'498', u'(513)', u'(513)'] 
[u'975', u'1,092', u'2,308', u'2,564', u'2,291', u'2,291'] 
[u'\u2014', u'(80)', u'\u2014', u'\u2014', u'\u2014', u'\u2014'] 
[u'(10)', u'6', u'5', u'2', u'(1)', u'(1)'] 
[u'(1,277)', u'(3,556)', u'(401)', u'(409)', u'(2,080)', u'(2,080)'] 
[u'3,823', u'995', u'(1,417)', u'(1,661)', u'(724)', u'(724)'] 
[u'(1,168)', u'4,953', u'(398)', u'(190)', u'3,137', u'3,137'] 
[u'(4,713)', u'(617)', u'(426)', u'(229)', u'\u2014', u'\u2014'] 
[u'232', u'\u2014', u'\u2014', u'\u2014', u'89', u'89'] 
[u'\u2014', u'5,513', u'\u2014', u'\u2014', u'3,037', u'3,037'] 
[u'\u2014', u'\u2014', u'(1)', u'\u2014', u'\u2014', u'\u2014'] 
[u'3,251', u'\u2014', u'\u2014', u'0', u'\u2014', u'\u2014'] 
[u'63', u'57', u'29', u'39', u'12', u'12'] 
[u'(2,207)', u'(3,843)', u'(604)', u'(168)', u'(3,026)', u'(3,026)'] 
[u'(1,482)', u'\u2014', u'\u2014', u'\u2014', u'\u2014', u'\u2014'] 
[u'1,816', u'\u2014', u'\u2014', u'\u2014', u'\u2014', u'\u2014'] 
[u'(151)', u'\u2014', u'\u2014', u'\u2014', u'\u2014', u'\u2014'] 
[u'(410)', u'(341)', u'\u2014', u'\u2014', u'\u2014', u'\u2014'] 
[u'(1,980)', u'(3,502)', u'(604)', u'(168)', u'(3,026)', u'(3,026)'] 
[u'136', u'(435)', u'(506)', u'140', u'(403)', u'(403)'] 
[u'1,806', u'1,318', u'884', u'377', u'518', u'518'] 
[u'1,941', u'884', u'377', u'518', u'115', u'115'] 
[u'\xa0', u'\xa0', u'\xa0', u'\xa0', u'\xa0', u'\xa0'] 
[u'3,511', u'(1,545)', u'495', u'498', u'(513)', u'(513)'] 
[u'(4,713)', u'(617)', u'(426)', u'(229)', u'\u2014', u'\u2014'] 
[u'(1,203)', u'(2,162)', u'69', u'269', u'(513)', u'(513)'] 

u'\u2014' ein Unicode ist _ Sie die Auf der Seite finden Sie fehlende Werte.

+0

Hi .. Vielen Dank für Ihre Antwort. Aber wenn ich das gleiche Skript unter Verwendung von Python 2.7 benutze, gibt es mir den folgenden Fehler. Es sieht so aus, als ob Sie ohne Fehler laufen können. Liegt es daran, dass Sie Python 3 ausführen? Könnten Sie mir bitte mitteilen, wie Sie den obigen Daten den Zeilenkopf (Index) hinzufügen? –

+0

Unten ist der Fehler, den ich für die Zeile erhalte: table = supp.select_one ("div.r_xcmenu.rf_table") ------------------------ -------------------------------------------------- -------------- Datei "C: \ Benutzer \ abhis \ Anaconda2 \ lib \ Site-Pakete \ spyderlib \ Widgets \ externalshell \ sitecustomize.py", Zeile 74, in execfile exec (kompilieren (scripttext, Dateiname 'exec'), glob, loc) Datei "C: /Users/abhis/Desktop/untitled0.py", Zeile 24, in table = soup.select_one ("div.r_xcmenu .rf_table ") TypeError: Objekt 'NoneType' ist nicht aufrufbar –

+0

Hallo, ich konnte das obige Problem lösen, indem ich die Zeile auskommentierte, die Fehler gab und die Variable" Tabelle "durch die Variable ersetzte" Suppe "in der Zeile unter ------------------------------------------- ----------------------------------------------- # table = soup.select_one ("div.r_xcmenu.rf_table") headers = [D.TEXT für d in soup.select ("div.rf_header [id^= Y_]")] Druckschriften für Zeile in supp.find_all ("div", "rf_crow", style = False): drucken ([d.text für d in row.select ("[id^= Y_]")]) –

Verwandte Themen