Power BI (Power Query) веб-запрос приводит к ошибке "CR должен сопровождаться LF"

Когда вы используете функцию Web.Page(Web.Contents('url')) для чтения таблицы с веб-страницы, некоторые сайты будут вызывать ошибку из-за несовместимого перевода строки.

DataSource.Error: Сервер совершил нарушение протокола. Раздел =ResponseHeader Detail=CR должен сопровождаться 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 и получить ту же проблему.

Основная проблема заключается в том, что четвертый файл cookie в заголовке ответа HTTP содержит недопустимый шестнадцатеричный символ 0x01 прямо посередине:

Bad Hex

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


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

Другие вопросы по тегам