2017-01-02 4 views
0

bitte auf den folgenden Link finden:Konvertieren von HTML geschabt Daten in Lesen und Schreiben von CSV-Datei Python BeautifulSoup mit

http://www.bseindia.com/stock-share-price/stockreach_financials.aspx?scripcode=505200&expandable=0

Ich habe versucht, die folgenden:

from bs4 import BeautifulSoup as soup 
import csv 
from pandas import read_csv 
import requests 

file_path=r'C:\Users\PreciseT3\Desktop\EicherStockDetails.csv' 
eicher_stock_url='http://www.bseindia.com/stock-share-price/stockreach_financials.aspx?scripcode=505200&expandable=0' 
get_url=requests.get(eicher_stock_url) 
target_table=soup(get_url.text,'lxml') 
extracted_table_data=target_table.find('table',id='acr') 
datasets=[] 
col_names=[] 
count=1 

with open(file_path,'r+') as file: 
writer=csv.writer(file) 
col_names.append('Years') 
for years_row in extracted_table_data.find('tr').find_all('td',class_='TTHeader'):  
    if not(years_row.get_text()=='(in Cr.)'): 
     print(years_row.get_text()) 
     col_names.append(years_row.get_text()) 

writer.writerow(col_names) 

with open(file_path,'r+') as file: 
writer=csv.writer(file) 
for row_headings in extracted_table_data.find('tr').find('td',class_='TTRow_left'): 
    col_names.append(row_headings) 
    for row_values in extracted_table_data.find('tr').find_all('td',class_='TTRow_right',text=lambda x:'6,188.03' in x or '3,031.22' in x or '1,702.47' in x or '1,049.26' in x or '670.95' in x): 
    col_names.append(row_values.get_text()) 

writer.writerow(col_names) 

und mein Ergebnis ist wie folgt :

Years,2016,2014,2013,2012,2011,Revenue,"6,188.03","3,031.22","1,702.47","1,049.26",670.95 

Meine Anforderungen sind:

  • statt ((in Cr.)) Spaltenname i ändern müssen, dass als ‚Jahr‘

  • ich es erkunden müssen und wollen die Daten als CSV-Datei erhalten (schreiben in csv unterstützt Datei), und ich möchte auch transponieren (T) die Zeilen und Spalten

  • ich brauche eine zusätzliche Spalten von einer anderen hTML-Seite (erfordern einige Beispiele)

Bitte freundlich mir helfen hinzuzufügen. ICH kann nicht weiter gehen. Danke im Voraus.

Antwort

0

Ich habe diesen Code ein bisschen geändert - aber die Logik sollte einfach zu folgen sein. Ich habe Cr und Year als Splitter für diese grundlegenden Analysedaten verwendet, aber Sie können das auch in Millionen/Qtr konvertieren, indem Sie den "main_split" -Teil des Codes anpassen.

from bs4 import BeautifulSoup 
import urllib2 
import pandas as pd 

url = 'http://www.bseindia.com/stock-share-price/stockreach_financials.aspx?scripcode=505200&expandable=0' 
html = urllib2.urlopen(url).read() 
soup = BeautifulSoup(html, "html.parser") 

main = [] 
for tr in soup.findAll('tr'): 
    mainSub = [] 
    for td in tr.findAll('td'): 
     mainSub += [td.text] 
    main += [mainSub] 

splitter = [] 
for y in range(len(main)): 
    splitter += [any('--' in x for x in main[y])] 

split_index = [x for x in range(len(splitter)) if splitter[x] == True] 

main_split = main[(split_index[7]+2):(split_index[8]-2)] 


main_zip = zip(*main_split) 
DF = pd.DataFrame(main_zip,columns=[x.replace(' ', '_') for x in main_zip.pop(0)]) 
print DF 

Hoffe, das hilft. Prost.

+0

Wirklich hat es mir sehr geholfen. Können Sie bitte die Schritte erklären, die Sie bisher gemacht haben? Und eine kleine Änderung, die Sie ändern müssen, ist, dass wir nicht direkt 'Pop' innerhalb von Zip-Dateien verwenden können. Stattdessen müssen wir sie in eine Liste konvertieren, dann können wir sie konvertieren. – DineshkumarVellingiri

+0

ausgezeichnete Arbeit. Und ich will auch Jahre in der ersten Spalte hinzufügen und ich möchte auch eine weitere Spalte hinzufügen, die von einer anderen Seite extrahiert werden muss (Gib mir ein Beispiel mit meinem gegebenen Link selbst). Es wäre nett, wenn du diese Schritte erklärst so viel wie du kannst. – DineshkumarVellingiri

+0

Die Logik ist einfach: alle Tabellen auf der Webseite in "main" holen, Tabellen mit '-' finden, die n-te Tabelle mit '-' finden, die die benötigten Daten in main_split haben, diese in main_zip transponieren und konvertieren zum Datenrahmen. Das Hinzufügen von Jahren kann durch eine ähnliche Verschrottung erfolgen - indem Sie diesen Code ein wenig modifizieren. Zusammenführen kann über Pandas Dataframe Merge durchgeführt werden. Es ist interessant, dass ich in eine schöne Suppe kam, weil ich ein ähnliches Projekt mit NSE ein paar Tage zurück begann :-) – Oxymoron88

Verwandte Themen