5

Web.Page(Web.Contents('url')) 関数を使用して Web ページからテーブルを読み取ると、一部のサイトでは改行の不一致が原因でエラーが発生します。

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
4

1 に答える 1

4

他のコード サンプルが機能しているように見えるかもしれませんが、それはおそらくまだ実行されていないことを意味します。


2 つのライブラリ関数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 要求を作成し、それらのバイトをブラウザーにロードします。

したがって、この場合、次のように呼び出すと:

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

適切な結果テーブルが得られますが、"From Web"Web.Contents('url')自体がエラーになるため、壊れます。


URL を共有してくださったので、http: //vote.sos.ca.gov/returns/president/party/democratic/county/allを試してみたところ、同じ問題が発生しました。

根本的な問題は、HTTP 応答ヘッダーの 4 番目の Cookie の真ん中に無効な 16 進文字 0x01 があることです。

悪い六角

これは、 http: //vote.sos.ca.gov/がサーバー上で修正できるものでしょうか? お問い合わせページで「バグレポート」を送信しようとしましたが、それが正しいチャネルかどうかわかりません...


ところで、私たちの HTTP クライアント ライブラリはあまり適切なエラー メッセージを表示しません。CR または LF 文字に問題はありません。Text.Replaceあったとしても、問題は HTTP 応答ヘッダーにあるため、この場合、応答本文で修正できるものは何もありません。

于 2016-06-17T06:25:16.193 に答える