Salve, ho bisogno di una applicazione che prenda delle informazioni dal codice HTML di alcune pagine web, per poi poterlo riutilizzare all'interno dell'applicazione stessa.
Ho trovato la libreria htmlcleaner_2.1 (a dire il vero ne ho provate diverse, ma tutte con lo stesso risultato), ed ho riscontrato un problema nell'estrazione di alcuni tipi paritcolari di caratteri, per la maggiore quelli accentati. Allego il codice di un esempio appositamente creato per farvi capire meglio di cosa si tratti e quale sia il problema.
Il progetto di prova è fatto da 2 classi, HTMLParser.java ed il main.java

HTMLParser.java
codice:

import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.htmlcleaner.CleanerProperties;
import org.htmlcleaner.HtmlCleaner;
import org.htmlcleaner.TagNode;

public class HtmlParser {
	
	// oggetto TagNode radice del file html
	private TagNode rootNode;
	private String url_str = null;
	
	public HtmlParser(String url_str)
	{
		//URL di cui si vuole fare il parsing
		this.url_str = url_str;
		
		// inizializzazione dell'oggetto HtmlCleaner utile a generare un html pulito
		HtmlCleaner cleaner = new HtmlCleaner();
		CleanerProperties props = cleaner.getProperties();
		props.setAllowHtmlInsideAttributes(true);
		props.setAllowMultiWordAttributes(true);
		props.setRecognizeUnicodeChars(true);
		props.setOmitComments(true);
		 
		// apertura della connessione
		URL url;
		try {
			
			url = new URL(url_str);
			URLConnection conn = url.openConnection();
			
			//ora utilizziamo l'oggetto cleaner per "ripulire" l'html e inizializzare l'oggetto rootNode
			rootNode = cleaner.clean(new InputStreamReader(conn.getInputStream()));
			
			
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			//Log.e("Error", e.getMessage());
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			//Log.e("Error", e.getMessage());
		}
	}
	
	
	List<Object> getElement(String elementName)
    {
        List<Object> elementList = new ArrayList<Object>();

        TagNode Elements[] = rootNode.getElementsByName(elementName, true);
        for (int i = 0; Elements != null && i < Elements.length; i++)
        {

            String type = Elements[i].getAttributeByName("href");
            if ( type != null )
            {
                elementList.add(Elements[i]);
            }

        }

        return elementList;
    }
	
	public String Stampa(String elementName)
    {
    	StringBuffer sb = new StringBuffer();
    	
        try
        {
           
            List<Object> elementi = this.getElement(elementName);

            sb.append(">>> Stampa contenuto degli elementi '"+elementName+"' per il sito '"+url_str+"'\n");
            for (Iterator<Object> iterator = elementi.iterator(); iterator.hasNext();)
            {
                TagNode Element = (TagNode) iterator.next();
                
                sb.append("Link: " + Element.getAttributeByName("href").toString()+"\n");
                
                
            }
            
            return sb.toString();
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
        
        return null;
    }
	
	public String StampaClasse(String className, String classAttr) {
	    StringBuffer sb = new StringBuffer();

	    try {   
	        List<TagNode> elementi = rootNode.getElementListByAttValue(className, classAttr, true, true);

	        sb.append(">>> Stampa contenuto degli elementi con classe'"+className+"' per il sito '"+url_str+"'\n");
	        TagNode el;
	        Iterator<TagNode> iterator = elementi.iterator();
	        while(iterator.hasNext()) {
	             el = iterator.next();
	             sb.append("Contenuto: " + el.getText() + "\n");
	        }
	        return sb.toString();
	    }
	    catch(Exception e) {
	        e.printStackTrace();
	    }
	       
	    return null;
	}
}
main.java:
codice:
 public class main {
	
	public static void main(String args[]) {
			
			System.out.println(TestHTMLParser());
	
	}
	
	
	public static String TestHTMLParser() {
		String elementName = "align";
		String elementValue = "left";
		String url_str = "http://www.staseraintv.com/programmi_stasera_rai1.html";
	        try {
	        	
	        	HtmlParser hp = new HtmlParser(url_str);

	            /* passiamo il risultato alla TextView per visualizzarli. */
	            return hp.StampaClasse(elementName, elementValue);
	        	
	             
	        } catch (Exception e) {
	             /* In caso di errore, passiamo l'errore alla TextView. */
	        	System.out.println("Problema nel parsing: \n" + e.getMessage());
	             //Log.e("Error", e.toString());
	        }
			return null;
	}
}
Quello che dovrebbe essere il mio obbiettivo è stampare il contenuto di tutti i tag che abbiano come classe "align" ed attributo "left"! Nel caso in cui dentro tali tag ci sia del testo con caratteri particolari, come in questa pagina di esempio nella sezione relativa alla programmazione di rai1, tali caratteri vengono interpretati male (un punto interrogativo bianco su rombo nero). Come ovviare?

ulteriore esempio:

supponiamo che nella mia pagina html da qualche parte abbia questo codice:
codice:
<div align="left">

06:00 - Euronews


06:10 - Unomattina Caffè


06:30 - TG1


06:40 - Previsioni sulla viabilità


06:45 - Unomattina


06:55 - Che tempo fa


07:00 - TG1


07:30 - Tg1 - L.I.S.


07:35 - TG Parlamento


07:58 - Che tempo fa


08:00 - TG1


08:50 - Tg1 Focus


08:55 - Che tempo fa


</div>
il mio programma dovrebbe stampare:
codice:
06:00 - Euronews

06:10 - Unomattina Caffè

06:30 - TG1

06:40 - Previsioni sulla viabilità

06:45 - Unomattina

06:55 - Che tempo fa

07:00 - TG1

07:30 - Tg1 - L.I.S.

07:35 - TG Parlamento

07:58 - Che tempo fa

08:00 - TG1

08:50 - Tg1 Focus

08:55 - Che tempo fa
invece vien fuori:
codice:
06:00 - Euronews

06:10 - Unomattina Caff�

06:30 - TG1

06:40 - Previsioni sulla viabilit�

06:45 - Unomattina

06:55 - Che tempo fa

07:00 - TG1

07:30 - Tg1 - L.I.S.

07:35 - TG Parlamento

07:58 - Che tempo fa
Grazie