2016-06-15 22 views
3

Wenn Sie die Funktion Web.Page (Web.Contents ('url')) verwenden, um eine Tabelle von einer Webseite zu lesen, einige Websites verursachen einen Fehler aufgrund inkonsistenter Zeilenumbrüche.Power BI (Energieabfrage) Webanforderung führt zu "CR muss von LF gefolgt werden" Fehler

Es scheint keine Option zu geben, die Sie an die Webfunktionen übergeben können, um diese Fehler zu ignorieren.

Diese Methode funktioniert für eine kurze Zeit, aber nicht überlebt nicht speichern/Refresh:

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 

Antwort

1

Es könnte wie die anderen Codebeispiel funktioniert aussehen, aber das bedeutet wahrscheinlich, dass es gerade nicht ausgeführt worden noch.


Die beiden Bibliotheksfunktionen Web.Contents('url') und Web.Page(Web.Contents('url')) verwenden unterschiedliche HTTP-Clients.

Web.Contents verwendet ein ziemlich grundlegendes HTTP-Client, aber Web.Page über ein nicht-transformierten Web.Contents stattdessen den IE-Browser verwenden, um die URL direkt zu laden. IE ist sehr verzeihend für alle HTTP-Protokollfehler, aber der grundlegende HTTP-Client ist viel strenger, was den angezeigten Fehler verursacht.

von Binary.Buffer oder Text.Replace in „zwischen“ Aufruf, dass die Optimierung überspringt, wo Web.Page den Browser direkt verwendet, und verwendet stattdessen Web.Contents die Web-Anfrage zu machen und dann diese Bytes in den Browser geladen wird.

in diesem Fall also, wenn Sie rufen

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

Sie werden ein gutes Ergebnis Tisch bekommen, aber „From Web“ wird gebrochen werden, weil die Web.Contents('url') selbst Fehler.


Da Sie die URL geteilt, konnte ich http://vote.sos.ca.gov/returns/president/party/democratic/county/all und bekommen das gleiche Problem versuchen.

Das zugrunde liegende Problem ist das vierte Cookie in den HTTP-Antwort-Header ein ungültiges Hex-Zeichen 0x01 direkt in der Mitte hat:

Bad Hex

Vielleicht ist das etwas, das http://vote.sos.ca.gov/ kann auf ihrem Server beheben? Ich habe versucht, einen „Bug-Report“ auf ihrem Kontakt Seite einreichen, aber ich bin mir nicht sicher, dass der richtige Kanal ist ...


BTW, unsere HTTP-Client-Bibliothek nicht geben sehr gute Fehlermeldungen gibt es nichts falsches CR oder LF Zeichen. Auch wenn es gab, gibt es nichts, Text.Replace über den Körper kann in diesem Fall beheben, weil das Problem in den HTTP-Headern ist.

+2

Vielen Dank für das Graben, ich schätze es sehr. Ja, es scheint, als ob es größtenteils mit einem CDN- oder API-Produkt "Incapsula" verwandt ist, das auf dieser und anderen Seiten verwendet wird. –