2016-08-03 2 views
1

私は電子商取引アプリケーションをテストするためにSeleniumを使用しています。リストのページでカテゴリを選択する際にリストされたアイテムを、データベース内のアイテムと照合する必要があります。そこで私はセレンを使ってページにアクセスし、ページソースをテキストファイルに保存しています。後でHTMLCleanerとJSoupを使ってこのテキストファイルを解析し、DBで検証したいフィールドを取得します。javaでのHTMLの保存と解析中に特殊文字と記号が発生する

しかし、ページに記載されている製品の中には、™、®などの特殊文字が使用されており、正しく保存/検索されずに疑問符で表示されることに気付きました。ストリームライター用エンコーディング定義ファイル

Document htmlFile = Jsoup.parse(fileSavedPreviously,"ISO-8859-1"); 
TagNode tagNode = new HtmlCleaner().clean(fileSavedPreviously); 

try { 
    org.w3c.dom.Document doc = new DomSerializer(new CleanerProperties()) 
     .createDOM(tagNode); 

} catch (ParserConfigurationException e) { 
    e.printStackTrace(); 
} 

//rest of the parsing.... 
+0

使用しているエンコーディングが正しくない可能性があります。 HTTPヘッダーから取得する必要があります。 –

答えて

4

BufferedWriter writer = null; 
try 
{ 
    writer = new BufferedWriter(new FileWriter(filepath+"/"+filename+".txt")); 
    writer.write(driver.getPageSource()); 
} 
catch (IOException e) 
{ 
    e.printStackTrace(); 
} 
finally 
{ 
    try 
    { 
     writer.close(); 
    } 
    catch (IOException e) 
    { 
    } 
} 

の取得と解析する:

writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fullpath), "UTF-8")); 

をさらに提供

コードは、私は、ページのソースを保存するために使用していますパーサーと同じもの:

Document htmlFile = Jsoup.parse(fileSavedPreviously, "UTF-8"); 

ページのエンコードを取得するには、ブラウザコンソールでdocument.inputEncodingを実行します。

2

あなたがFileWriterのコンストラクタを使用している場合、それはあなたがそのような問題に直面している場合は、代わりに次のように明示的に文字エンコーディングを定義するためにOutputStreamWriterのコンストラクタを使用する必要がありますので、明らかにこれらの特殊文字をカバーしていないデフォルトの文字セットを使用します:

writer = new BufferedWriter(
    new OutputStreamWriter(new FileOutputStream(filepath+"/"+filename+".txt"), charsetName 
); 

ISO-8859-1ので、カバーは®なく、™、あなたはUTF-8などのUnicode文字セットを使用して、あなたのコンテンツを書いて、あなたがそれをどこを読んで両方の場所でそれを設定する必要があります。

+1

素敵で有益なことに、もう少しコードを追加することができます。使用される "ISO-8859-1"(Latin-1)は、 "Windows-1252"(Windows Latin-1)に置き換えることができます。これは、ブラウザが "ISO-8859-1"を参照するときに使用するものです。そこに™があります。 (もちろん、ベスト/ユニバーサルはUTF-8でしょう) –

+0

@JoopEggen興味深い情報です –

関連する問題