Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    [Java] Parsing di file html per estrarre tag

    Ciao,
    ho letto le altre discussioni riguardanti l'argomento, ma dato che nessuno risponde alla mia domanda ho aperto un altro topic.

    Ho un file html e vorrei estrarre da questo tutti i tag <a href .....></a>

    Esiste una classe pronta per far cio?

    Grazie.

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [Java] Parsing di file html per estrarre tag

    Originariamente inviato da wwebm
    Ho un file html e vorrei estrarre da questo tutti i tag <a href .....></a>

    Esiste una classe pronta per far cio?
    O usi librerie esterne specifiche per il "parsing" di codice HTML .... o leggi tutto il file, ne ottieni un String (o StringBuffer) e poi fai ricerche "a mano" es. con le "espressioni regolari".
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Se volessi fare con le espressioni regolari come dovrei fare per estrarre tutti i tag ?

    Scusami ma non sono molto esperto.

    Grazie.

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da wwebm
    Se volessi fare con le espressioni regolari come dovrei fare per estrarre tutti i tag ?
    Dipende da cosa vuoi estrarre .... l'intera parte comprendente tag di apertura/fine? Solo il contenuto di href? E/o il markup contenuto nel tag??
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Come risultato finale mi piacerebbe ottenere questo:
    abcdefg

    Parsing:

    www.blabla.bla abcedfg

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da wwebm
    Come risultato finale mi piacerebbe ottenere questo:
    abcdefg

    Parsing:

    www.blabla.bla abcedfg
    Questo ti potrà servire come "base":

    codice:
    import java.util.regex.*;
    
    public class ParseHtml {
        public static void main(String[] args) {
            String html = "<html><body><a href=\"http://www.html.it\">HTML.it</a></body></html>";
    
            Pattern pattern = Pattern.compile("<a href=\"(.*?)\">(.*?)</a>");
            Matcher matcher = pattern.matcher(html);
    
            while (matcher.find()) {
                System.out.println("href=" + matcher.group(1) + "  -  contenuto=" + matcher.group(2));
            }
        }
    }
    E comunque il pattern sopra si può ancora ampliare ulteriormente. Che succede se ad esempio tra "a" e "href" ci sono tab o più spazi? Che succede se il contenuto del tag spanna su più "righe" (cioè con newline in mezzo)? La regex sopra non basterebbe ma si può cambiarla per accettare una forma più complessa.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Grazie!
    Una domanda...se la stringa è contenuta in un file.....cosa gli devo passare al matcher?
    Sempre una riga del file alla volta?

    Posso passargli tutto il file? Se si non potrei eliminare dal file tutti gli spazi e i ritorni a capo?

    E comunque il pattern sopra si può ancora ampliare ulteriormente. Che succede se ad esempio tra "a" e "href" ci sono tab o più spazi? Che succede se il contenuto del tag spanna su più "righe" (cioè con newline in mezzo)? La regex sopra non basterebbe ma si può cambiarla per accettare una forma più complessa.
    Come faccio per risolvere questi possibili problemi? C'è qualche buona guida? O sono semplici modifiche?

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da wwebm
    Una domanda...se la stringa è contenuta in un file.....cosa gli devo passare al matcher?
    Per avere un Matcher al matcher() devi passare un CharSequence .... e lo è String, StringBuffer, StringBuilder. Quindi non certo subito un file direttamente!

    Originariamente inviato da wwebm
    Sempre una riga del file alla volta?
    Non ti conviene!

    Originariamente inviato da wwebm
    Posso passargli tutto il file?
    Leggi dal file tutti i caratteri, li butti in un StringBuffer e sei a posto. Per "leggere tutti i caratteri" intendo: FileReader o InputStreamReader+FileInputStream e poi leggi a blocchi di char che butti nel StringBuffer.

    Originariamente inviato da wwebm
    non potrei eliminare dal file tutti gli spazi e i ritorni a capo?
    Tecnicamente potresti anche farlo ma .... ti serve davvero? Sarebbe critico/dubbio. Una riga finisce con "ciao" e la riga successiva inizia con "mondo". Se elimini il newline ottieni "ciaomondo". Davvero è quello che volevi???

    Originariamente inviato da wwebm
    Come faccio per risolvere questi possibili problemi? C'è qualche buona guida? O sono semplici modifiche?
    La descrizione dei costrutti delle regex di Java la trovi nel javadoc di Pattern.
    Guide/tutorial sulle regex le trovi anche, in rete.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Allora per la lettura del file ho fatto cosi':

    codice:
    int i;
    		        StringBuffer sb = new StringBuffer ();
    		        String fpath="c:/prova.htm"; 
    		 
    	DataInputStream is = new DataInputStream ( new FileInputStream (fpath));
    
    			    BufferedReader br=new BufferedReader(new InputStreamReader(is));
    
    			    do{
    			      i=br.read();
    			      System.out.println((char)i);
    			      sb.append(i);
    			    }while (i!=-1);
    			      is.close();
    Quindi ora basta mettere sb al posto di html?:

    codice:
    Pattern pattern = Pattern.compile("<a href=\"(.*?)\">(.*?)</a>");
    		        Matcher matcher = pattern.matcher(sb);
    		        while (matcher.find()) {
    		            System.out.println("href=" + matcher.group(1) + "  -  contenuto=" + matcher.group(2));
    		        }
    		    }
    Ad andare va pero' non mi restituisce nulla.....

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.