2016-06-15 6 views
3

Когда вы используете функцию Web.Page (Web.Contents ('url')) для чтения таблицы с веб-страницы, некоторые сайты будут вызывать ошибку из-за несогласованных строк.Power BI (Power Query) Результат веб-запроса: «CR должен сопровождаться LF» Ошибка

DataSource.Error: The server committed a protocol violation. Section=ResponseHeader Detail=CR must be followed by LF

Существует не какой-либо вариант, который вы можете передать веб-функциям, чтобы игнорировать эти ошибки.

Этот метод работает на короткое время, но не выживает сохранения/обновления:

let 
    BufferedBinary = Binary.Buffer(Web.Contents("http://vote.sos.ca.gov/returns/president/party/democratic/county/all")), 
    CleanedUp = Text.Replace(Text.Replace(Text.FromBinary(BufferedBinary), "#(cr,lf)", "#(lf)"), "#(lf)", "#(cr,lf)"), 
    Table = Web.Page(CleanedUp) 
in 
    Table 

ответ

1

Это может выглядеть, как и другие код образцов работ, но это, вероятно, означает, что он просто не был запущен все же.


Две функции библиотеки Web.Contents('url') и Web.Page(Web.Contents('url')) использовать различные клиенты HTTP.

Web.Contents использует довольно простой HTTP-клиент, но Web.Page по не преобразованному Web.Contents вместо этого использует браузер IE для загрузки URL-адреса напрямую. IE очень прощает любые ошибки протокола HTTP, но основной HTTP-клиент является гораздо более строгим, что вызывает ошибку, которую вы видите.

Позвонив Binary.Buffer или Text.Replace в «между», который пропустит оптимизацию где Web.Page использует браузер непосредственно, и вместо этого он использует Web.Contents, чтобы сделать веб-запрос, а затем загружает эти байты в браузере.

Таким образом, в этом случае, если вы вызываете

Web.Page(Web.Contents("http://vote.sos.ca.gov/returns/president/party/democratic/county/all")) 

Вы получите хороший результат таблицу, но «из Интернета» будет нарушена, потому что Web.Contents('url') сама по себе будет ошибка.


Поскольку вы разделили URL, я был в состоянии попробовать http://vote.sos.ca.gov/returns/president/party/democratic/county/all и получить ту же самую проблему.

Основной проблемой является четвёртым печенье в заголовке ответа HTTP имеет неверный шестнадцатеричный символ 0x01 прямо посередине:

Bad Hex

Может быть, это то, что http://vote.sos.ca.gov/ может исправить на своем сервере? Я попытался подав «сообщение об ошибке» на их странице Контакты но я не уверен, что это правильный канал ...


BTW, наша библиотека HTTP-клиент не дает очень хорошие сообщения об ошибках, есть ничего неправильного CR или LF символов. Даже если бы не было, в этом случае ничего не может сделать Text.Replace над телом, потому что проблема в заголовках HTTP.

+2

Благодарим вас за это, я очень ценю это. Да, похоже, что это в значительной степени связано с CDN или продуктом API «Инкапсула», который используется на этом и других сайтах. –