2011-07-14 51 views
3

ファイルから特定のタグを削除してHTMLファイルを変換する必要があります。拡張エスケープモードを使用したjsoup出力の問題

import org.jsoup.Jsoup; 
import org.jsoup.helper.Validate; 
import org.jsoup.nodes.Document; 
import org.jsoup.nodes.Entities; 
import org.jsoup.nodes.Entities.EscapeMode; 

import java.io.IOException; 
import java.io.File; 
import java.util.*; 

public class TestJsoup { 
    public static void main(String[] args) throws IOException { 
     Validate.isTrue(args.length == 1, "usage: supply url to fetch"); 
     String url = args[0]; 

     Document doc = null; 
     if(url.contains("http")) { 
      doc = Jsoup.connect(url).get(); 
     } else { 
      File f = new File(url); 
      doc = Jsoup.parse(f, null); 
     } 

     /* remove some tags */ 

     doc.outputSettings().escapeMode(Entities.EscapeMode.extended); 
     System.out.println(doc.html()); 

     return; 
    } 
} 

上記のコードの問題は、私は、拡張エスケープモードを使用する場合、出力はHTMLでエンコードされたHTML属性タグを持っている、ということである - これを行うために、私はこのようなものを持っています。これを避けるためにとにかくありますか?非標準拡張(’など)エンコーディングのいくつかが問題を引き起こすため、エスケープモードをベースまたはxhtmlとして使用すると機能しません。下記のHTMLのための元のために、私が手

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html> 
<head> 
<title>Test&reg;</title> 
</head> 
<body style="background-color:#EDEDED;"> 
<P> 
    <font style="color:#003698; font-weight:bold;">Testing HTML encoding - &rsquo; &copy; with a <a href="http://www.google.com">link</a> 
    </font> 
    <br /> 
</P> 
</body> 
</html> 

出力され、

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html> 
<head>&NewLine; 
    <title>Test&reg;</title>&NewLine; 
</head>&NewLine; 
<body style="background-color&colon;&num;EDEDED&semi;">&NewLine; 
    <p>&NewLine; <font style="color&colon;&num;003698&semi; font-weight&colon;bold&semi;">Testing HTML encoding - &rsquor; &copy; with a <a href="http&colon;&sol;&sol;www&period;g 
oogle&period;com">link</a></font> <br />&NewLine;</p>&NewLine;&NewLine;&NewLine;&NewLine; 
</body> 
</html> 

は、この問題を回避するとにかくはありますか?

答えて

7

output encodingあなたはどの文字を使用していますか? (これはデフォルトで入力になります。これは、URLからロードする場合、サイトによって異なります)。

UTF-8を処理できないシステムで作業している場合は、UTF-8またはASCIIなどの低い値に明示的に設定することをお勧めします。エスケープモードをbase(デフォルト)に設定し、文字セットをasciiに設定すると、選択された文字セットでネイティブに表現できない文字(たとえばrsquo)が数値エスケープとして出力されます。例えば

String check = "<p>&rsquo; <a href='../'>Check</a></p>"; 
Document doc = Jsoup.parse(check); 
doc.outputSettings().escapeMode(Entities.EscapeMode.base); // default 

doc.outputSettings().charset("UTF-8"); 
System.out.println("UTF-8: " + doc.body().html()); 

doc.outputSettings().charset("ASCII"); 
System.out.println("ASCII: " + doc.body().html()); 

は与える:

UTF-8: <p>’ <a href="../">Check</a></p> 
ASCII: <p>&#8217; <a href="../">Check</a></p> 

は、この情報がお役に立てば幸い!

+0

「&」がエスケープされないようにするにはどうすればよいですか?エスケープモードが 'Entities.EscapeMode.xhtml'に設定されている場合は、どのキャラクタセットでもエスケープされているようです。 – Randy

+0

有効なHTML/XMLを生成するには、 '&'をエスケープする必要があるので、無効にするオプションはありません。 –

関連する問題