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
main.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; } }
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?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; } }
ulteriore esempio:
supponiamo che nella mia pagina html da qualche parte abbia questo codice:
il mio programma dovrebbe stampare: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>
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 08:00 - TG1 08:50 - Tg1 Focus 08:55 - Che tempo fa
Graziecodice: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

Rispondi quotando
