2016-04-13 4 views
3

特定のページをテキストファイルに変換するか、wget(例:-m)を使用してリンクをダウンロードしていますが、ほとんどのツールはソースの解釈に失敗しています。私は、このページには、いくつかのバイナリデータと特殊文字を、例えば構成されていることを発見しましたこのhtmlページで何が問題になっていますか?

その後
$ html2text -check http://www.free-energy-info.co.uk/ 
<HTML> 
<HEAD> 
<TITLE> 
... 

$ curl http://www.free-energy-info.co.uk/ | html2text 
curl: (23) Failed writing body (0 != 2896) 

しかし-check戻っ正しくソースコードを使用します。たとえば

$ curl -s http://www.free-energy-info.co.uk/ | head | cat -v 
M-^?M-~<^@h^@t^@m^@l^@>^@ 
^@ 
^@<^@h^@e^@a^@d^@>^@ 
^@ 
^@<^@T^@I^@T^@L^@E^@>^@F^@r^@e^@e^@-^@E^@n^@e^@r^@g^@y^@ ^@D^@e^@v^@i^@c^@e^@s^@,^@ ^@z^@e^@r^@o^@-^@p^@o^@i^@n^@t^@ ^@e^@n^@e^@r^@g^@y^@,^@ ^@a^@n^@d^@ ^@w^@a^@t^@e^@r^@ ^@a^@s^@ ^@H^@H^@O^@ ^@f^@u^@e^@l^@<^@/^@T^@I^@T^@L^@E^@>^@ 

このウェブサイトに問題がありますか?それはWebサーバーのバグですか、ソースコードは意図的にスクランブルされているか、(圧縮されていないので)特別なフォーマットを使用していますか?このページを標準のutils(例えばwget)で理解できるようにするには?

ウェブブラウザでは問題なく動作します。

+0

有効なユーザーエージェントを送信しているときにもcurlと同じ結果が得られます。しかし、wgetは私のために働く。 – Paul

+0

@Paul Wgetは単一のページをダウンロードしますが、ソースコードを理解していないようなリンク( '-m'や' -r'を指定する場合)を辿っていません。 – kenorb

答えて

3

ページは単にUTF-16LE形式です(これはW3 Validatorで確認できます)。 (UTF-16BE、用U+FFFE UTF-16LE用U+FEFF

初期バイナリシーケンスが呼び出されthe byte order markテキストがUnicode(8ビット、16ビットまたは32ビットのいずれかをコードしているプログラムへのシグナリング(BOM)ビット)。

$ curl -s http://www.free-energy-info.co.uk/ | hexdump -n2 
0000000 ff fe 

wgetまたはhtml2textはまだこのようなフォーマットをサポートしていないようなので、それが聞こえます。ダウンロードしますが、問題はコンテンツの解析(再帰的ダウンロード)にあります。現在のバージョンのwgetでは、従来のC文字列関数では入力データを使用できると仮定していますが、UTF-16(Unicode)は使用できません(The input byte stream参照)。回避策については


あなたは、例えば、iconvコマンドを使用して、バックUTF-8にソースコードを変換することができます

ので
$ curl -s http://www.free-energy-info.co.uk/ | iconv -f "UTF-16" -t "UTF-8" | head | cat -v 
<html> 
<head> 
<TITLE>Free-Energy Devices, zero-point energy, and water as HHO fuel</TITLE> 
<META NAME="Description" CONTENT="magnet power, free energy devices, power from aerials, gravity power, water power, renewable energy and electronics tutorial."> 

UTF-8へcurlでページを保存するための構文、次のようになります。例えば、html2textが動作するようにするためにその後

curl -s http://example.com/ | iconv -f "UTF-16" -t "UTF-8" > index.html 

標準入力からソースコードを読みます

iconv -f "UTF-16" -t "UTF-8" <(curl -s http://www.free-energy-info.co.uk/) | html2text 

そしてwgetのために、あなたは--remote-encodingを指定することができますが、これはまだサポートされていません、それはで失敗:GNUでテスト

IRIを

をサポートしていない

このバージョンWget 1.16.3。


私はTim Ruehsenは彼がwgetの次のバージョン2にUTF-16でエンコードされたHTMLページのサポートの解析を犯したことを述べたが、それはまだいくつかの作業(例えば必要#47689、でこのバグを報告してきました-kまだ動作しません)。

新しいバージョンをテストした後、試してみてください。

wget -r --local-encoding=UTF-16LE --input-file index.html --force-html --base http://www.free-energy-info.co.uk 

Timによって示唆されているように。

注:デバッグをサポートするようにwgetをコンパイルした場合は、-dを追加してください。

関連する問題