2016-05-21 7 views
0

Ich habe versucht, ein Skript zu portieren, die grundlegende Daten von Yahoo Finance-Website anfordern, aber ich würde nach bestimmten Elementen statt der gesamten Berichte, wie Preis zu suchen Buchverhältnisse, zum Beispiel. Also, ich habe ein Tutorial von Sentdex verfolgt, wie man das macht. Das Problem ist, dass der Beispielcode für Python 2.7 geschrieben wurde und ich versuche, dass das für Python 3 funktioniert und natürlich erweitert wird, indem weitere Features hinzugefügt werden.Verwenden von Python 3 zum Abrufen von Bestandsinformationen Von Yahoo Finance Site

Hier ist, wie es schaut so weit:

import time 
import urllib 
import urllib.request 


sp500short = ['a', 'aa', 'aapl', 'abbv', 'abc', 'abt', 'ace', 'aci', 'acn', 'act', 'adbe', 'adi', 'adm', 'adp'] 


def yahooKeyStats(stock): 

    try: 
     sourceCode = urllib.request.urlopen('http://finance.yahoo.com/q/ks?s='+stock).read() 
     pbr = sourceCode.split('Price/Book (mrq):</td><td class="yfnc_tabledata1">')[1].split('</td>')[0]  
     print ('price to book ratio:'),stock,pbr 

    except Exception as e: 
     print ('failed in the main loop'),str(e) 


for eachStock in sp500short: 
    yahooKeyStats(eachStock) 
    time.sleep(1) 

Ich bin fast sicher, dass das Problem auf der pbr Variablendefinition ist, auf dem Splitting ein Teil davon. Die:

Price/Book (mrq):</td><td class="yfnc_tabledata1"> 

Und ...:

</td> 

... sind nur eine Art Trennzeichen wie das, was ich suche, den tatsächlichen Wert, liegt zwischen diesen beiden oben aufgeführten Gegenstände. Aber bis jetzt gibt es mir nur die Ausnahmebedingung, wenn ich es ausführe.

Jede Hilfe wird sehr geschätzt. Cheers,

+0

Verwenden Sie einen HTML-Parser wie BeautifulSoup. –

+1

Es gibt viele Möglichkeiten zu tun, was Sie wollen, ohne eine Webseite zu scrappen ... Related: http://StackOverflow.com/Questions/12433076/Download-History-Stock-Prices-Automatisch-von-Yahoo-Finance-in-Python –

Antwort

1

Es sieht aus wie urllib.request.urlopen und .read() wird, um Daten zurückkehr mit Typ bytes.

den Python-docs:

Beachten Sie, dass urlopen ein Byte-Objekt zurückgibt. Dies liegt daran, dass es für urlopen nicht möglich ist, die Codierung des Byte-Streams, der vom HTTP-Server empfangen wird, automatisch zu bestimmen. Im Allgemeinen dekodiert ein Programm das zurückgegebene Byte-Objekt in eine Zeichenkette, sobald es die entsprechende Codierung ermittelt oder geschätzt hat.

Die Split-Methode schlägt hier fehl. Versuchen Sie, .decode() nach .read() anzufügen. Das Problem ist, dass Sie versuchen, die sourceCode Variable vom Typ bytes durch eine Zeichenfolge zu teilen. Decoding sourceCode wird es von Bytes in Zeichenfolge konvertieren. Alternativ könnten Sie beide Ihre Trennzeichen .encode().

bytes.decode

+0

Guter Punkt !! Ich habe es getan, und es scheint, dass der Problemcodeblock jetzt verarbeitet wird, aber immer noch teilweise, da ich das 'Preis-Buch-Verhältnis' vom Skript erhalte, aber nicht den Wert selbst: sourceCode = urllib.request.urlopen ('http : //finance.yahoo.com/q/ks? s = '+ stock) .read() .decode() – dude

+0

Ihre Syntax für das Drucken einer Zeichenfolge scheint hier im Beispiel zu sein. Sollte sein: 'print ('Preis-Buch-Verhältnis:', stock, pbr)' –

+0

Danke Kumpel !! Das hat es geschafft! : D – dude

Verwandte Themen