2016-03-27 5 views
2

Ich versuche Aktien Dividenden Daten von Webseiten mit F # und die FSharp.Data Bibliothek zu kratzen. Eine Beispielseite ist unter http://www.nasdaq.com/symbol/ibm/dividend-history zu sehen.Web Scraping Aktien Dividend Daten mit F #

die Web-Seite anzufordern, ist mein Code-Setup als eine einfache Konsolenanwendung als Beispiel und ist wie folgt:

open FSharp.Data 

[<EntryPoint>] 
let main argv = 
    let url = "http://www.nasdaq.com/symbol/ibm/dividend-history" 
    let result = Http.RequestString(url) 
    System.Console.ReadLine() |> ignore 
    0 // return an integer exit code 

Sobald er ausgeführt wird, die request Methode Fehler mit:

„Eine nicht behandelte Ausnahme vom Typ 'System.ArgumentOutOfRangeException' in FSharp.Core.dll aufgetreten

Zusätzliche Informationen: Länge kann nicht kleiner als Null sein. "

Es sieht so aus, als ob die Seite so formatiert ist, dass "traditionelle" Scraping-Ansätze nicht funktionieren. Irgendwelche Ideen oder Gedanken würden geschätzt werden.

+0

Ich habe dies selbst ausprobiert und festgestellt, dass: an '[email protected] (Int32 ich, String cookiePart) in ... FSharp.Data \ src \ Net \ Http.fs: Zeile 675 'war, wo der eigentliche Unfall war. Es wird versucht, 'String.Substring' aufzurufen, so dass Sie eine Länge bis zum ersten" = "Symbol erhalten. Leider wird das mit String.IndexOf definiert, das -1 gibt, wenn kein "=" Symbol vorhanden ist. Relevanter Quellcode: https://github.com/fsharp/FSharp.Data/blob/master/src/Net/Http.fs#L674 und Kommentar: '.NET hat Probleme beim Parsen einiger Cookies. Siehe http: // stackoverflow.com/a/22098131/165633' – Ringil

Antwort

0

Dies ist die vollständige Stacktrace ich, wenn ich den Code ausführen:

System.ArgumentOutOfRangeException: Length cannot be less than zero. 
Parameter name: length 
    at System.String.Substring(Int32 startIndex, Int32 length) 
    at [email protected](Int32 i, String cookiePart) in C:\Git\FSharp.Data\src\Net\Http.fs:line 675 
    at Microsoft.FSharp.Collections.ArrayModule.IterateIndexed[T](FSharpFunc`2 action, T[] array) 
    at FSharp.Data.HttpHelpers.getAllCookiesFromHeader(String header, Uri responseUri, CookieContainer cookieContainer) in C:\Git\FSharp.Data\src\Net\Http.fs:line 671 
    at <StartupCode$FSharp-Data>[email protected](WebResponse _arg2) in C:\Git\FSharp.Data\src\Net\Http.fs:line 803 
    at [email protected](a a) 
--- End of stack trace from previous location where exception was thrown --- 
    at Microsoft.FSharp.Control.AsyncBuilderImpl.commit[a](Result`1 res) 
    at Microsoft.FSharp.Control.CancellationTokenOps.RunSynchronously[a](CancellationToken token, FSharpAsync`1 computation, FSharpOption`1 timeout) 
> at Microsoft.FSharp.Control.FSharpAsync.RunSynchronously[T](FSharpAsync`1 computation, FSharpOption`1 timeout, FSharpOption`1 cancellationToken) 
    at <StartupCode$FSI_0004>[email protected]() in C:\Users\helgeu.COMPODEAL\AppData\Local\Temp\~vs2B9.fsx:line 8 
Stopped due to error 

Ich glaube, Sie leider auf einen Fehler zu dieser Cookiebehandlung Code im Zusammenhang gestolpert:

https://github.com/fsharp/FSharp.Data/issues/904

<rant>

Ich habe versucht, in diesen Code zu suchen, aber es gibt mir Kopfschmerzen Aus dem bösen cut and paste einiger google antworten wir, wie man in C# mit cookies umgeht und dann schlecht in F # übersetzt wird.

</rant >

vielleicht Informationen zu diesem Github Fall Denken Sie Hinzufügen könnte als hier eine bessere Option sein.