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)
它可能看起来像其他代码示例一样有效,但这可能意味着它尚未运行。
这两个库函数Web.Contents('url')
并Web.Page(Web.Contents('url'))
使用不同的HTTP客户端。
Web.Contents
使用非常基本的 HTTP 客户端,但Web.Page
在未转换的情况下Web.Contents
将使用 IE 浏览器直接加载 URL。IE 对于任何 HTTP 协议错误都非常宽容,但基本的 HTTP 客户端要严格得多,这会导致您看到的错误。
通过在“之间”调用Binary.Buffer
or 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 响应标头中。
归档时间: |
|
查看次数: |
2288 次 |
最近记录: |