Поставщик типа ProviderImplementation.HtmlProvider сообщил об ошибке: недопустимая часть файла cookie «Значение» = «XXXX» - PullRequest
1 голос
/ 23 мая 2019

Я использую 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.

Ответы [ 2 ]

2 голосов
/ 23 мая 2019

Похоже, что это не удается, потому что F # Data отправляет куки в формате, который не нравится службе Nasdaq.Простой обходной путь - загрузить страницу один раз, чтобы образец был доступен во время компиляции, а затем загрузить страницу во время выполнения, используя другие средства.

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)

Это работает, но есть две проблемы:

  • Страница не содержит таблиц / списков, поэтому значение ns не дает вам хорошего статического доступа ко всему полезному
  • При попытке загрузить данные я получаю исключение тайм-аутаиспользуя WebClient, так что, возможно, это тоже не сработает (но, может быть, я просто за прокси или что-то в этом роде) ...
1 голос
/ 24 мая 2019

Чтобы сделать HTTP-запрос к https://www.nasdaq.com/symbol/AAPL/news-headlines,, мы должны предоставить CookieContainer .Поскольку вы используете библиотеку FSharp.Data , я предлагаю использовать ее HTTP Utilities :

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"

Конечно, вы должны предварительно загрузить страницу исначала сохраните в /tmp.html.

Небольшое примечание: если у нас уже есть строка HTML (как в нашем случае), мы используем Nasdaq.Parse;если у нас есть URL, мы используем Nasdaq.Load.

...