Power BI (Power Query) Web 请求导致“CR 必须后跟 LF”错误

Jam*_*ite 5 newline m web-scraping powerquery powerbi

当您使用Web.Page(Web.Contents('url'))函数从网页中读取表格时,某些站点会因换行不一致而导致错误。

DataSource.Error: 服务器违反了协议。Section=ResponseHeader Detail=CR 后必须跟 LF

似乎没有任何选项可以传递给 Web 函数来忽略这些错误。

此方法仅适用于一小段时间,但在保存/刷新后无法继续使用:

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
Run Code Online (Sandbox Code Playgroud)

Car*_*lsh 4

它可能看起来像其他代码示例一样有效,但这可能意味着它尚未运行。


这两个库函数Web.Contents('url')Web.Page(Web.Contents('url'))使用不同的HTTP客户端。

Web.Contents使用非常基本的 HTTP 客户端,但Web.Page在未转换的情况下Web.Contents将使用 IE 浏览器直接加载 URL。IE 对于任何 HTTP 协议错误都非常宽容,但基本的 HTTP 客户端要严格得多,这会导致您看到的错误。

通过在“之间”调用Binary.Bufferor Text.Replace,将跳过直接使用浏览器的优化Web.Page,而是使用它Web.Contents来发出 Web 请求,然后将这些字节加载到浏览器中。

因此,在这种情况下,如果您调用:

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

您将得到一个好的结果表,但“来自网络”将被破坏,因为它Web.Contents('url')本身会出错。


由于您共享了 URL,我可以尝试http://vote.sos.ca.gov/returns/president/party/democratic/county/all并遇到同样的问题。

根本问题是 HTTP 响应标头中的第四个 cookie 在中间有一个无效的十六进制字符 0x01:

坏十六进制

也许这是http://vote.sos.ca.gov/可以在他们的服务器上修复的问题?我尝试在他们的“联系我们”页面上提交“错误报告”,但我不确定这是正确的渠道......


顺便说一句,我们的 HTTP 客户端库没有给出很好的错误消息,CR 或 LF 字符没有任何问题。即使有,Text.Replace在这种情况下响应正文也无法修复,因为问题出在 HTTP 响应标头中。

  • 非常感谢您对此进行深入研究,我真的很感激。是的,它似乎很大程度上与本网站和其他网站上使用的 CDN 或 API 产品“Incapsula”相关。 (2认同)