Möchten Sie Binärdateien anstelle von HTML zurückgeben?

12

Ich verwende wget, um eine statische HTML-Seite herunterzuladen. Der W3C Validator teilt mir mit, dass die Seite in UTF-8 codiert ist. Doch wenn ich die Datei nach dem Download kate, bekomme ich eine Menge binären Blödsinn. Ich bin auf Ubuntu und dachte, die Standardkodierung wäre UTF-8? Das scheint meine Gebietsschemadatei zu sagen. Warum passiert das und wie kann ich es korrigieren?

Sieht auch so aus Content-Encoding: gzip. Vielleicht macht das einen Unterschied?

Das ist die einfache Bitte:

wget https://www.example.com/page.html

Ich habe es auch versucht:

wget https://www.example.com/page.html -q -O - | iconv -f utf-16 -t utf-8 > output.html

Welches zurückgegeben: iconv: illegal input sequence at position 40

cat'ing die Datei gibt binär zurück, die so aussieht:

l�?חu�`�q"�:)s��dġ__��~i��6n)T�$H�#���QJ

Ergebnis von xxd output.html | head -20:

00000000: 1f8b 0800 0000 0000 0003 bd56 518f db44  ...........VQ..D
00000010: 107e a6bf 62d4 8a1e 48b9 d8be 4268 9303  .~..b...H...Bh..
00000020: 8956 082a 155e 7a02 21dd cbd8 3bb6 97ae  .V.*.^z.!...;...
00000030: 77cd ee38 39f7 a1bf 9d19 3bb9 0bbd 9c40  w..89.....;....@
00000040: 2088 12c5 de9d 9df9 be99 6f67 f751 9699   .........og.Q..
00000050: 500d 1d79 5eee a265 faec 7151 e4ab 6205  P..y^..e..qQ..b.
00000060: 4dd3 0014 1790 e7d0 77c0 ef2f cbf8 cde3  M.......w../....
00000070: cf1f 7d6c 7d69 ec16 d0d9 c67f 7d7d 56c9  ..}l}i......}}V.
00000080: 04c5 eb33 35fc e49e 2563 e908 ca10 0d45  ...35...%c.....E
00000090: 31ce afcf a022 e77a 34c6 fa46 46be d88f  1....".z4..FF...
000000a0: a41e ab79 446d 76d6 702b cf45 9e7f ba77  ...yDmv.p+.E...w
000000b0: 7dc2 779c 274e cc18 483c 3a12 0f75 f07c  }.w.'N..H<:..u.|
000000c0: 5e63 67dd b886 ab48 e550 b5c4 f0e3 db0d  ^cg....H.P......
000000d0: 54c1 85b8 8627 2ff3 2ff3 17f9 0626 d31d  T....'/./....&..
000000e0: d9a6 e5b5 4076 663f 94ec 7b5a 17cf 7ade  ....@vf?..{Z..z.
000000f0: 00d3 0d9f 4fcc d733 ef8d a0bb 0a06 c7eb  ....O..3........
00000100: b304 6fb1 b1cc 18ed 90e0 8710 43aa 424f  ..o.........C.BO
00000110: 50c7 d0c1 2bac 09be 4d1c 2566 335e 666c  P...+...M.%f3^fl
00000120: 1e20 951d 58fd 6774 f3e9 f317 749f 7fc4  . ..X.gt....t...
00000130: d651 cdca f5a7 b0a5 aea4 08ab 055c e4c5  .Q...........\..

Seltsamerweise scheint sich die Ausgabedatei auch in TextWrangler ordnungsgemäß zu öffnen!

ΓΓIICK
quelle
1
Eine Überarbeitung der Frage, um den verwendeten Befehl und die erzeugte Ausgabe bereitzustellen, wäre hier eine große Hilfe.
Steve
LANG = de_DE.UTF-8 iconv: Unzulässige Eingabesequenz an Position 40
ΓΓIICK
1
Können Sie uns zeigen, wie der "binäre Unsinn" aussieht? Ich würde vorschlagen, laufen: xxd dubious.file| head -20` und das als update.
Bruce Ediger
@BruceEdiger aktualisiert.
ΓΓIICK
Seltsamerweise scheint sich die Ausgabedatei auch in TextWrangler korrekt zu öffnen!
ΓΓIICK

Antworten:

28

Dies ist eine komprimierte gzip- Datei. Sie können dies herausfinden, indem Sie den fileBefehl ausführen, der das Dateiformat anhand der magischen Zahlen in den Daten ermittelt (so stellen Programme wie Text Wrangler fest, dass die Datei auch komprimiert ist):

file output.html
wget -O - … | file -

Der Server (ich habe es anhand des Inhalts erraten, den Sie gezeigt haben) sendet gezippte Daten und setzt den Header korrekt

Content-Encoding: gzip

aber wget unterstützt das nicht. In neueren Versionen sendet wget Accept-encoding: identity, um den Server anzuweisen, die Daten nicht zu komprimieren oder anderweitig zu codieren. In älteren Versionen können Sie den Header manuell senden:

wget --header 'Accept-encoding: identity' …

Dieser bestimmte Server scheint jedoch kaputt zu sein: Er sendet komprimierte Daten, auch wenn er angewiesen wird, die Daten in keiner Weise zu verschlüsseln. Sie müssen die Daten also manuell dekomprimieren.

wget -O output.html.gz … && gunzip output.html.gz
Gilles 'SO - hör auf böse zu sein'
quelle
Sehr schöne Analyse
Roaima
Übrigens können Sie auf gunzipdie gleiche Art und Weise weiterleiten file, wenn Sie keine temporäre Datei speichern möchten. Möglicherweise möchten Sie übergeben -coder --to-stdout(oder als zcat), um es in die Pipeline in der Frage zwischen wgetund einzufügen iconv.
Toby Speight
15

Diese Datei ist noch mit komprimiert gzip.

Sie können sehen, dass die ersten beiden Bytes 0x1f8b mit der gzipSignatur übereinstimmen . Um die Daten zu lesen, müssen Sie sie dekomprimieren.

mv file.dat file.dat.gz
gunzip file.dat.gz

Oder

zcat file.dat
Roaima
quelle