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

时间:2016-06-15 14:15:01

标签: web-scraping newline powerbi powerquery m

当您使用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

1 个答案:

答案 0 :(得分:2)

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

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

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

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

所以在这种情况下,如果你调用

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

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

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

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

Bad Hex

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

BTW,我们的HTTP客户端库没有提供非常好的错误消息,没有错误的CR或LF字符。即使有,在这种情况下,身体上Text.Replace也无法解决,因为问题出在HTTP标题中。