1

私は次のようにJavaでWebページをダウンロードしようとしています:

URL url = new URL("www.jksfljasdlfas.com");
FIle to = new File("/home/test/test.html");

Reader in = new InputStreamReader(url.openStream(), "UTF-8");
Writer out = new OutputStreamWriter(new FileOutputStream(to), "UTF-8");

int c;
while((c = in.read()) != -1){
    out.write(c);
}
in.close();
out.close();

ページをダウンロードすると、一部の文字がエンティティに置き換えられます。
これ:これ
<a href="http://www.generation276.org/film/?m=200812&paged=2" >Pagina successiva &raquo;</a>
になります:
<a href="http://www.generation276.org/film/?m=200812&#038;paged=2" >Pagina successiva &raquo;</a>
Chromeで同じページをダウンロードすると、&は&のままになります。
私はCharset/encodingの初心者です。誰かがプローブを理解できますか?

4

2 に答える 2

4

Java部分は完全に正常に機能しています。

Chromeはあなたをだましています。Firefoxで、を選択するView -> Page Sourceと、次のように表示されます。

<a href="http://www.generation276.org/film/?m=200812&#038;paged=3" >
Pagina successiva &raquo;</a>

FireBug / Inspect Elementを使用しているときに、次のように表示されます。

<a href="http://www.generation276.org/film/?m=200812&paged=3" style="">
Pagina successiva »</a>

そしてそれは次のようにクリップボードにコピーします:

<a href="http://www.generation276.org/film/?m=200812&amp;paged=3" style="">
Pagina successiva »</a>

ブラウザは、実際にそこにあるものを常に表示するとは限りません。


質問の2番目の部分は、この前の質問と同じです。

Java:HttpUtility.HtmlDecodeのようなJavaでHTML文字エンティティをデコードする方法は?

したがって、答えも同じです。

Apache Commons / LangプロジェクトのStringEscapeUtils.unescapeHTML(String)を使用します。

于 2010-09-15T23:49:41.947 に答える
2

そのページの実際のソースは次のように述べています。

<a href="http://www.generation276.org/film/?m=200812&#038;paged=2" >Pagina successiva &raquo;</a>

これはまったく問題ありません。エンティティ参照が一般的ですが&#038;、HTMLのリテラルアンパサンド文字の有効な文字参照です。&amp;

<a href="http://www.generation276.org/film/?m=200812&paged=2" >Pagina successiva &raquo;</a>

これは無効なHTMLです。

「HTMLのみ」を保存すると、Chromeは元のHTMLソースを変更せずに保存します。'Complete'を保存すると、他のリソースへの参照を変更するためにページを書き直す必要があります。

残念ながら、これに関連するシリアル化プロセスには&、URLのアンパサンドをエスケープできないというバグがあるようです。ブラウザは通常これを回避できますが、アンパサンドの右側の単語が有効なHTMLエンティティ名または文字参照を作成すると、壊れます(URLを操作します)。

Chromeが属性値をシリアル化する他の場所(など)はinnerHTML、このかなり貧弱なバグの影響を受けません。

ETA:

&...を「エスケープ解除」する必要があります。どうすればよいですか?

正規表現を使用してソースから情報を取得しようとすると、HTMLデコーダーを使用して手動でデコードする必要があります。Javaに組み込まれているものはないため、seanizerによってリンクされているApacheCommonsのようなサードパーティツールが必要になります。

ただし、正規表現によるスクレイピングは粗雑で信頼性がありません。HTMLパーサーを使用してファイルをロードし、必要なデータを選択することを強くお勧めします。属性値とテキストコンテンツのデコードを処理します。

于 2010-09-15T23:51:17.417 に答える