The type provider 'ProviderImplementation.HtmlProvider' reported an error: The 'Value'='XXXX' part of the cookie is invalid
The type provider 'ProviderImplementation.HtmlProvider' reported an error: The 'Value'='XXXX' part of the cookie is invalid
我正在使用 HtmlProvider 来网络抓取股票公司新闻,例如https://www.nasdaq.com/symbol/{STOCK_SYMBOL_HERE}/news-headlines
但我在这行代码中遇到错误
let [<Literal>] stockNewsUrl = "https://www.nasdaq.com/symbol/AAPL/news-headlines"
let news = new HtmlProvider<stockNewsUrl>()
第二行有波浪线,错误是Error FS3033 The type provider 'ProviderImplementation.HtmlProvider' reported an error: Cannot read sample HTML from 'https://www.nasdaq.com/symbol/AAPL/news-headlines': The 'Value'='AAPL,technology' part of the cookie is invalid.
这似乎失败了,因为 F# Data 以 Nasdaq 服务不喜欢的格式发送 cookie。一个简单的解决方法是下载页面一次,以便在 compile-time 上获得示例,然后在运行时使用其他方式下载页面。
type Nasdaq = HtmlProvider<"c:/temp/nasdaq.html">
let wc = new WebClient()
let downloaded = wc.DownloadString("https://www.nasdaq.com/symbol/AAPL/news-headlines")
let ns = Nasdaq.Load(downloaded)
这可行,但有两个问题:
- 该页面不包含任何 tables/lists,因此
ns
值不能让您很好地静态访问任何有用的东西
- 当我尝试使用
WebClient
下载数据时出现超时异常,所以也许这也不起作用(但这可能只是因为我在代理或其他东西后面......)
向 https://www.nasdaq.com/symbol/AAPL/news-headlines, we are required to provide a CookieContainer. Since you are using the FSharp.Data library, I suggest to use its HTTP Utilities 发出 HTTP 请求:
type Nasdaq = HtmlProvider<"/tmp.html">
let cc = CookieContainer ()
let data =
Http.RequestString ("https://www.nasdaq.com/symbol/AAPL/news-headlines", cookieContainer = cc)
|> Nasdaq.Parse
data.Tables.``Today's Market Activity``.Html
|> printfn "%A"
当然你必须先pre-download页面并保存到/tmp.html
。
小提示:如果我们已经有了 HTML 字符串(在我们的例子中),我们使用 Nasdaq.Parse
;如果我们有 url,我们使用 Nasdaq.Load
。
我正在使用 HtmlProvider 来网络抓取股票公司新闻,例如https://www.nasdaq.com/symbol/{STOCK_SYMBOL_HERE}/news-headlines
但我在这行代码中遇到错误
let [<Literal>] stockNewsUrl = "https://www.nasdaq.com/symbol/AAPL/news-headlines"
let news = new HtmlProvider<stockNewsUrl>()
第二行有波浪线,错误是Error FS3033 The type provider 'ProviderImplementation.HtmlProvider' reported an error: Cannot read sample HTML from 'https://www.nasdaq.com/symbol/AAPL/news-headlines': The 'Value'='AAPL,technology' part of the cookie is invalid.
这似乎失败了,因为 F# Data 以 Nasdaq 服务不喜欢的格式发送 cookie。一个简单的解决方法是下载页面一次,以便在 compile-time 上获得示例,然后在运行时使用其他方式下载页面。
type Nasdaq = HtmlProvider<"c:/temp/nasdaq.html">
let wc = new WebClient()
let downloaded = wc.DownloadString("https://www.nasdaq.com/symbol/AAPL/news-headlines")
let ns = Nasdaq.Load(downloaded)
这可行,但有两个问题:
- 该页面不包含任何 tables/lists,因此
ns
值不能让您很好地静态访问任何有用的东西 - 当我尝试使用
WebClient
下载数据时出现超时异常,所以也许这也不起作用(但这可能只是因为我在代理或其他东西后面......)
向 https://www.nasdaq.com/symbol/AAPL/news-headlines, we are required to provide a CookieContainer. Since you are using the FSharp.Data library, I suggest to use its HTTP Utilities 发出 HTTP 请求:
type Nasdaq = HtmlProvider<"/tmp.html">
let cc = CookieContainer ()
let data =
Http.RequestString ("https://www.nasdaq.com/symbol/AAPL/news-headlines", cookieContainer = cc)
|> Nasdaq.Parse
data.Tables.``Today's Market Activity``.Html
|> printfn "%A"
当然你必须先pre-download页面并保存到/tmp.html
。
小提示:如果我们已经有了 HTML 字符串(在我们的例子中),我们使用 Nasdaq.Parse
;如果我们有 url,我们使用 Nasdaq.Load
。