Bạn quên trả lại nhị phân thay vì html?


12

Tôi đang sử dụng wget để tải xuống một trang html tĩnh. Trình xác thực W3C cho tôi biết trang được mã hóa theo UTF-8. Tuy nhiên, khi tôi gửi tệp sau khi tải xuống, tôi nhận được một loạt các vô nghĩa nhị phân. Tôi đang sử dụng Ubuntu và tôi nghĩ mã hóa mặc định là UTF-8? Đó là những gì tập tin địa phương của tôi dường như nói. Tại sao điều này xảy ra và làm thế nào tôi có thể sửa nó?

Ngoài ra, có vẻ như Content-Encoding: gzip. Có lẽ điều này làm cho một khác biệt?

Đây là yêu cầu đơn giản:

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

Tôi cũng đã thử điều này:

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

Mà trả lại: iconv: illegal input sequence at position 40

cat'ing tệp trả về nhị phân trông như thế này:

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

Kết quả của 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...........\..

Ngoài ra, thật kỳ lạ, tệp đầu ra dường như mở đúng trong TextWrangler!


1
sửa đổi câu hỏi để cung cấp lệnh đang được sử dụng và đầu ra được tạo ra sẽ giúp ích rất nhiều ở đây.
steve

LANG = en_US.UTF-8 iconv: chuỗi đầu vào bất hợp pháp tại vị trí 40
ΓΓIICK

1
Bạn có thể chỉ cho chúng tôi "vô nghĩa nhị phân" trông như thế nào không? Tôi muốn đề nghị chạy: xxd dubious.file| đầu -20` và bao gồm đó là một bản cập nhật.
Bruce Ediger

@BruceEdiger cập nhật.
ΓΓIICK

Ngoài ra, thật kỳ lạ, tệp đầu ra dường như mở chính xác trong TextWrangler!
ΓΓIICK

Câu trả lời:


28

Đây là một tập tin nén gzip . Bạn có thể tìm ra điều này bằng cách chạy filelệnh, tìm ra định dạng tệp từ các số ma thuật trong dữ liệu (đây là cách các chương trình như Text Wrangler tìm ra rằng tệp cũng được nén):

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

Máy chủ (tôi đoán nó từ nội dung bạn đã hiển thị) đang gửi dữ liệu được nén và đặt tiêu đề chính xác

Content-Encoding: gzip

Nhưng wget không hỗ trợ điều đó. Trong các phiên bản gần đây, wget gửi Accept-encoding: identity, để báo cho máy chủ không nén hoặc mã hóa dữ liệu. Trong các phiên bản cũ hơn, bạn có thể gửi tiêu đề theo cách thủ công:

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

Tuy nhiên, máy chủ đặc biệt này dường như bị hỏng: nó gửi dữ liệu nén ngay cả khi được yêu cầu không mã hóa dữ liệu theo bất kỳ cách nào. Vì vậy, bạn sẽ phải giải nén dữ liệu theo cách thủ công.

wget -O output.html.gz … && gunzip output.html.gz

Phân tích rất hay
roaima

BTW, bạn có thể chuyển sang gunzipcùng một cách như bạn làm file, nếu bạn không muốn lưu trữ tạm thời. Bạn có thể muốn vượt qua -choặc --to-stdout(hoặc gọi nó là zcat) để chèn nó vào đường ống dẫn trong câu hỏi, giữa wgeticonv.
Toby Speight

15

Tập tin này vẫn được nén với gzip.

Bạn có thể thấy rằng hai byte đầu tiên 0x1f8b khớp với gzipchữ ký . Vì vậy, để đọc dữ liệu bạn cần giải nén nó.

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

Hoặc là

zcat file.dat
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.