2016-04-13 9 views
-3

Ich bin Scraping Finanzdaten von "http://profit.ndtv.com/stock/hindustan-unilever-ltd_hindunilvr/financials-historical"Iterierte, Nonetype zu String Umwandlung

Code:

import requests 
from bs4 import BeautifulSoup 
import re 

url = "http://profit.ndtv.com/stock/hindustan-unilever-ltd_hindunilvr/financials-historical" 


page = requests.get(url) 
soup = BeautifulSoup(page.text, 'html.parser') 
table = soup.find("table", {"id": "finsummaryTab"}) 
tr = table.findAll("tr") 


def periodEnding(index): 
    td = BeautifulSoup(str(tr[2]), 'html.parser') 
    td_list = td.find_all("td") 
    return td_list[index].getText() 

b = print(periodEnding(1)) 
a = str(b) 
print(type(a)) 
for i in a: 
    print(i) 

Ausgang:

216.35 

<class 'str'> 
N 
o 
n 
e 

Ich weiß nicht, warum dies geschieht, kann jemand helfen ich damit. thannkyou möchte ich diese Zahlen

+0

Warum analysieren Sie die Tabellenzeile * noch einmal *? 'td_list = tr [2] .find_all ('td')' würde Ihnen die gleichen Ergebnisse ohne eine vollständige Umwandlung in String und zurück zu BeautifulSoup 'Tag'-Objekten geben. –

+0

Verwenden Sie auch nicht das Python-2.7-Tag, wenn Sie Python 3 verwenden. Sie hätten einen Syntaxfehler in Python 2 mit genau diesem Code erhalten. –

+0

@MartijnPieters, Ich möchte Daten in MySQL-Datenbank veröffentlichen. und das Ergebnis von "td_list = tr [2] .find_all ('td')" ***** ist ***** "[ Grundkapital , 216,35 , 216,27 , 216,25 , 216,15 , 215.95 ]" –

Antwort

3
iterieren

Sie den Rückgabewert von print() mit:

b = print(periodEnding(1)) 

print()immer kehrt None. Sie haben dann versucht, jedes einzelne Zeichen der Zeichenkette "None" (produziert von a = str(b)) zu drucken, damit Sie tatsächlich die Buchstaben N, o, n und e gedruckt bekommen.

Shop der Rückgabewert von periodEnding() statt:

b = periodEnding(1) 
print(b) 

Sie sind auch unnötig neuparsen der tr[2] Objekt hier:

td = BeautifulSoup(str(tr[2]), 'html.parser') 
td_list = td.find_all("td") 

Es gibt keinen Punkt dies zu tun. tr[2] ist ein Tag Objekt und unterstützt find_all direkt:

def periodEnding(index): 
    td_list = tr[2].find_all("td") 
    return td_list[index].getText() 

Dies Ihnen genau die gleiche Ergebnis liefert, ohne dann wieder in nahezu den gleichen BeautifulSoup Objektbaum einen ganzen Teilbaum in eine Zeichenfolge zu konvertieren.