PDA

View Full Version : Java leggere html


Pro7on
24-06-2007, 19:22
e possibile leggere una pagina html?

PGI-Bis
24-06-2007, 19:43
Leggerla nel senso di scaricarla da internet come testo non formattato, sì. Leggerla nel senso di visualizzarla come testo stilizzato, con immagini collegamenti eccetera, nì.

Nì perchè pur avendo la piattaforma standard delle API dedicate alle proiezione di pagine HTML, la versione di HTML che supportano è paleolitica.

La soluzione sta nel cercare delle librerie java che visualizzino pagine in HTML "moderno", usare JDIC (sono della API) per integrare il browser html di sistema in un'interfaccia grafica o creare delle librerie che leggano l'HTML attuale.

L'ultima soluzione richiede giusto quei dieci-quindicimila anni di lavoro... :D

Pro7on
24-06-2007, 20:28
Leggerla nel senso di scaricarla da internet come testo non formattato, sì. Leggerla nel senso di visualizzarla come testo stilizzato, con immagini collegamenti eccetera, nì.

Nì perchè pur avendo la piattaforma standard delle API dedicate alle proiezione di pagine HTML, la versione di HTML che supportano è paleolitica.

La soluzione sta nel cercare delle librerie java che visualizzino pagine in HTML "moderno", usare JDIC (sono della API) per integrare il browser html di sistema in un'interfaccia grafica o creare delle librerie che leggano l'HTML attuale.

L'ultima soluzione richiede giusto quei dieci-quindicimila anni di lavoro... :D

io voglio solo ricevere il codice html di una pagina ...?

andbin
24-06-2007, 20:47
io voglio solo ricevere il codice html di una pagina ...?Una cosa del genere:
import java.io.*;
import java.net.*;


public static void downloadFromUrl (URL url, String filename, String userAgent)
throws IOException
{
InputStream is = null;
FileOutputStream fos = null;

try
{
URLConnection urlConn = url.openConnection ();
urlConn.setRequestProperty ("User-Agent", userAgent);

is = urlConn.getInputStream ();
fos = new FileOutputStream (filename);

byte[] buffer = new byte[1024];
int len;

while ((len = is.read (buffer)) > 0)
fos.write (buffer, 0, len);
}
finally
{
if (is != null)
is.close ();
if (fos != null)
fos.close ();
}
}Come vedi non è una cosa così fantascientifica ....

PGI-Bis
24-06-2007, 21:43
Il finally ha qualcosa che non va. E perchè non usare i canali negli esempio in cui si creano dei buffer. Siamo moderni, suvvia! :D

Pro7on
24-06-2007, 23:31
Il finally ha qualcosa che non va. E perchè non usare i canali negli esempio in cui si creano dei buffer. Siamo moderni, suvvia! :D


mi sto confondendo:confused:

PGI-Bis
24-06-2007, 23:44
Il sistema di andbin va benissimo, usa quello se ti è chiaro.

Se noti, andbin ha messo le istruzioni che chiudono i flussi in un blocco finally. La forma:

try {
fai qualcosa
} finally {
qualcos'altro
}

causa l'esecuzione del contenuto del blocco finally a prescindere dal modo in cui termina l'esecuzione del blocco try.

Ha fatto quello che tutti dovrebbero sempre fare.

A mio sommesso avviso l'intoppo sta nel fatto che il suo blocco finally contiene due istruzioni:

is.close()

e

fos.close()

Se l'esecuzione di is.close() genera un'eccezione allora fos.close() non sarà eseguita.

La forma coerente con le intenzioni è una bruttura necessaria:

try {

} finally {
try {
is.close();
} finally {
fos.close();
}
}

A volte ho visto anche la forma esteticamente migliore:

try {

} finally {
disposeStreams(is, fos);
}

dove "disposeStreams è a sua volta un metodo che dichiara il rilascio di una IOException e contiene un try { is.close(); } finally { fos.close(); }. Insomma, la stessa cosa ma in salsa diversa.
Ma solo perchè andbin ha avuto l'accortezza di dichiarare il rilascio dell'eccezione IOException. Altrimenti ci sarebbero stati pure i catch.

Pro7on
25-06-2007, 08:44
Il sistema di andbin va benissimo, usa quello se ti è chiaro.

Se noti, andbin ha messo le istruzioni che chiudono i flussi in un blocco finally. La forma:
...........
} finally {
disposeStreams(is, fos);
}[/code]

dove "disposeStreams è a sua volta un metodo che dichiara il rilascio di una IOException e contiene un try { is.close(); } finally { fos.close(); }. Insomma, la stessa cosa ma in salsa diversa.
Ma solo perchè andbin ha avuto l'accortezza di dichiarare il rilascio dell'eccezione IOException. Altrimenti ci sarebbero stati pure i catch.



a okKk credo di aver capito il tuo ragionamento:D e provo prima quello di anbin e se mai lo modifico ;) thx

Pro7on
25-06-2007, 09:02
probblemino:

-prima cosa ho creato un file.txt nella cartella del progetto

poi:


Classe Main




package tvlist;

import java.net.URL;

/**
*
* @author edpsam
*/
public class Main {



/** Creates a new instance of Main */
public Main() {
}

/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here

Gestione g = new Gestione();

url = "http://www.google.it";
filename = "file.txt";
userAgentm = "CIAO";


g.getPagina(url, userAgentm, userAgentm);


}

private URL url;
private String filename;
private static String userAgentm;



}



Classe: Gestione





package tvlist;


import java.io.*;
import java.net.*;
/**
*
* @author edpsam
*/
public class Gestione {

public Gestione() {




}

public void getPagina(URL url, String filename, String userAgent) throws IOException{

InputStream is = null;
FileOutputStream fos = null;

try
{
URLConnection urlConn = url.openConnection ();
urlConn.setRequestProperty ("User-Agent", userAgent);

is = urlConn.getInputStream ();
fos = new FileOutputStream (filename);

byte[] buffer = new byte[1024];
int len;

while ((len = is.read (buffer)) > 0)
fos.write (buffer, 0, len);
}
finally
{
if (is != null)
is.close ();
if (fos != null)
fos.close ();
}

}


}


l'errore me lo da quando dichiaro le variabili


PS: cos'è user agent?

andbin
25-06-2007, 09:50
Il finally ha qualcosa che non va.Se ti riferisci al fatto che se is.close() lancia una eccezione, fos.close() non viene eseguito, allora hai perfettamente, ancora una volta, ragione!
È che ho sempre dubbi su quale sia il modo migliore per trattare le eccezioni sui close(). A uno potrebbe anche non fregargliene nulla ....
C'è poi un'altra cosa: se una read o write lancia una eccezione e nel finally una close lancia a sua volta una eccezione, il metodo ha una nuova "ragione" di uscita, che "sovrascrive" l'eccezione originale della read/write che invece potrebbe (o dovrebbe?) essere più importante.

E perchè non usare i canaliPerché non li conosco ancora bene :fiufiu:
Dammi tempo! Prima fammi prendere sta SCJP (ho già avuto il voucher per l'esame ;) ) poi ci penso io ai channel (che tanto non sono nell'esame) :D

Pro7on
25-06-2007, 09:59
Se ti riferisci al fatto che se is.close() lancia una eccezione, fos.close() non viene eseguito, allora hai perfettamente, ancora una volta, ragione!
È che ho sempre dubbi su quale sia il modo migliore per trattare le eccezioni sui close(). A uno potrebbe anche non fregargliene nulla ....
C'è poi un'altra cosa: se una read o write lancia una eccezione e nel finally una close lancia a sua volta una eccezione, il metodo ha una nuova "ragione" di uscita, che "sovrascrive" l'eccezione originale della read/write che invece potrebbe (o dovrebbe?) essere più importante.

Perché non li conosco ancora bene :fiufiu:
Dammi tempo! Prima fammi prendere sta SCJP (ho già avuto il voucher per l'esame ;) ) poi ci penso io ai chann
el (che tanto non sono nell'esame) :D

fate finta che nn esista :D :D :muro: :muro:

no dai mi dite plase xche dichiaro male?

andbin
25-06-2007, 10:16
url = "http://www.google.it";
filename = "file.txt";
userAgentm = "CIAO";


g.getPagina(url, userAgentm, userAgentm);


}

private URL url;
private String filename;
private static String userAgentm;[/CODE]Le tre variabili che hai dichiarato sono variabili di istanza (marcate private). All'interno di un qualunque metodo statico (come il main), il 'this' non esiste, pertanto senza un apposito reference all'oggetto le variabili non sono accessibili.

PS: cos'è user agent?Lo "user agent", detto in generale, è una applicazione client che utilizza il networking per accedere a un qualche servizio di rete (e tipicamente si riferisce al web).
La stringa di uno user agent è semplicemente una riga di testo che contiene informazioni sul tipo/versione del browser ed eventualmente altre informazioni su S.O. ecc...

http://it.wikipedia.org/wiki/User_agent
http://en.wikipedia.org/wiki/User_agent

Pro7on
25-06-2007, 10:19
haa ok thx ;) nn lo sapevo questo :D: :D: D:



cmq quel URL url vuol dire che dichiaro una variabile di nome url di tipo URL...
ma cos'è il tipo URL?

andbin
25-06-2007, 10:29
haa ok thx ;) nn lo sapevo questo :D: :D: D: Beh, non ti chiedo che cosa sono le asserzioni, le annotazioni, i wildcard nei generics o cosa sono i metodi "bridge", perché sono cose abbastanza avanzate .... però le questioni su visibilità dei membri, uso di this/super, ecc... sono veramente le basi .....

cmq quel URL url vuol dire che dichiaro una variabile di nome url di tipo URL...
ma cos'è il tipo URL?http://java.sun.com/javase/6/docs/api/java/net/URL.html

Pro7on
25-06-2007, 10:37
Beh, non ti chiedo che cosa sono le asserzioni, le annotazioni, i wildcard nei generics o cosa sono i metodi "bridge", perché sono cose abbastanza avanzate .... però le questioni su visibilità dei membri, uso di this/super, ecc... sono veramente le basi .....

http://java.sun.com/javase/6/docs/api/java/net/URL.html



ma nn ho capito bene se devo creare una classe URL? o basta che mi estendo?

andbin
25-06-2007, 10:40
ma nn ho capito bene se devo creare una classe URL? o basta che mi estendo?URL url = new URL ("http://www.pippo.com");

Pro7on
25-06-2007, 10:46
URL url = new URL ("http://www.pippo.com");

mmm ecco quando uno e gnubbo è gnubbo -.-''

Thx cmq