【问题标题】:Web scraping stock dividend data with F#使用 F# 在 Web 上抓取股票股息数据
【发布时间】:2016-03-28 01:58:26
【问题描述】:

我正在尝试使用 F# 和 FSharp.Data 库从网页中抓取股票股息数据。在http://www.nasdaq.com/symbol/ibm/dividend-history 可以看到一个示例页面。

为了请求网页,我的代码设置为一个简单的控制台应用程序作为示例,如下所示:

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 方法出错:

“在 FSharp.Core.dll 中发生了“System.ArgumentOutOfRangeException”类型的未处理异常

附加信息:长度不能小于零。"

看起来页面的格式设置为“传统”抓取方法行不通。任何想法或想法将不胜感激。

【问题讨论】:

  • 我自己试过了,发现:FSharp.Data.HttpHelpers.getAllCookiesFromHeader@671.Invoke(Int32 i, String cookiePart) in ...FSharp.Data\src\Net\Http.fs:line 675 是实际崩溃的地方。它正在尝试调用String.Substring,以便您获得不超过第一个“=”符号的长度。遗憾的是,这是使用 String.IndexOf 定义的,当没有“=”符号时它给出 -1。相关源码:github.com/fsharp/FSharp.Data/blob/master/src/Net/Http.fs#L674和评论:.NET has trouble parsing some cookies. See http://stackoverflow.com/a/22098131/165633

标签: f# web-scraping f#-data


【解决方案1】:

这是我运行代码时得到的完整堆栈跟踪:

System.ArgumentOutOfRangeException: Length cannot be less than zero.
Parameter name: length
   at System.String.Substring(Int32 startIndex, Int32 length)
   at FSharp.Data.HttpHelpers.getAllCookiesFromHeader@671.Invoke(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>.$Http.InnerRequest@803-5.Invoke(WebResponse _arg2) in C:\Git\FSharp.Data\src\Net\Http.fs:line 803
   at Microsoft.FSharp.Control.AsyncBuilderImpl.args@835-1.Invoke(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>.$FSI_0004.main@() in C:\Users\helgeu.COMPODEAL\AppData\Local\Temp\~vs2B9.fsx:line 8
Stopped due to error

我认为您不幸偶然发现了与此 cookie 处理代码相关的错误:

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

我曾尝试查看该代码,但它让我头疼,因为一些谷歌答案的邪恶剪切和粘贴关于如何在 C# 中处理 cookie,然后被严重翻译为 F#。

认为向那个 github 案例添加信息可能是比这里更好的选择。

【讨论】:

猜你喜欢
  • 2013-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-15
  • 1970-01-01
相关资源
最近更新 更多