2016-03-27 7 views
2

F#およびFSharp.Dataライブラリを使用してWebページから在庫配当データを掻き取ろうとしています。ページの例はhttp://www.nasdaq.com/symbol/ibm/dividend-historyにあります。 F#によるWebスクレイピング在庫配当データ

がWebページを要求するには、私のコードは、一例として、単純なコンソールアプリケーションとして設定され、次のとおりです。実行

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 

、RequestStringメソッドエラーが発生した:

「未処理タイプ 'System.ArgumentOutOfRangeException'の例外がFSharp.Core.dllで発生しました

追加情報:長さはゼロより小さくすることはできません。

"従来の"スクレイピングアプローチが機能しないようにページがフォーマットされているようです。任意のアイデアや思考をいただければ幸いです。

+0

私はこれを試してみたところ、次のように見つけました:[email protected](Int32 i、String cookiePart)... FSharp.Data \ src \ Net \ Http.fs:line 675実際のクラッシュがどこにあったのか。 'String.Substring'を呼び出して、最初の" = "記号までの長さを取得しようとしています。残念ながら、それはString.IndexOfを使って定義され、 "="記号がないときは-1を返します。関連するソースコード:https://github.com/fsharp/FSharp.Data/blob/master/src/Net/Http.fs#L674 and comment: '.NETはいくつかのクッキーの解析に問題があります。 http:// stackoverflow.com/a/22098131/165633'を参照してください。 – Ringil

答えて

0

私は、コード実行したときにこれは私が取得フルスタックトレースです:

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

<:私はあなたが、残念ながら、このCookie処理コードに関連するバグにつまずいたと思う

System.ArgumentOutOfRangeException: Length cannot be less than zero. 
Parameter name: length 
    at System.String.Substring(Int32 startIndex, Int32 length) 
    at FSharp.Data.HttpHelpers.getAllCookiesFromH[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 

をラスト>

私はそのコードを調べようとしましたが、それは私に頭痛を与えるいくつかのGoogleの答えの悪いカットとペーストからC#でクッキーを処理する方法について、そしてひどくF#に翻訳されています。

< /暴言>

多分ここよりも良い選択肢かもしれないとgithubのケースに情報を追加することを考えてみてください。

関連する問題