Je voudrais pouvoir récupérer le code HTML d'une page Web et l'enregistrer dans un String
fichier, afin que je puisse y faire un traitement. Aussi, comment pourrais-je gérer différents types de compression.
Comment procéderais-je en utilisant Java?
Je voudrais pouvoir récupérer le code HTML d'une page Web et l'enregistrer dans un String
fichier, afin que je puisse y faire un traitement. Aussi, comment pourrais-je gérer différents types de compression.
Comment procéderais-je en utilisant Java?
Réponses:
Voici un code testé utilisant la classe URL de Java . Je recommanderais cependant de faire un meilleur travail que je ne le fais ici pour gérer les exceptions ou les transmettre dans la pile d'appels.
public static void main(String[] args) {
URL url;
InputStream is = null;
BufferedReader br;
String line;
try {
url = new URL("http://stackoverflow.com/");
is = url.openStream(); // throws an IOException
br = new BufferedReader(new InputStreamReader(is));
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (MalformedURLException mue) {
mue.printStackTrace();
} catch (IOException ioe) {
ioe.printStackTrace();
} finally {
try {
if (is != null) is.close();
} catch (IOException ioe) {
// nothing to see here
}
}
}
DataInputStream
par BufferedReader
. Et remplacer "dis = new DataInputStream(new BufferedInputStream(is));"
à"dis = new BufferedReader(new InputStreamReader(is));"
InputStreamReader
?
J'utiliserais un analyseur HTML décent comme Jsoup . C'est alors aussi simple que:
String html = Jsoup.connect("http://stackoverflow.com").get().html();
Il gère GZIP et les réponses fragmentées et le codage des caractères de manière totalement transparente. Il offre également plus d'avantages, comme la traversée HTML et la manipulation par des sélecteurs CSS, comme jQuery peut le faire. Vous n'avez qu'à le saisir en tant que Document
, pas en tant que String
.
Document document = Jsoup.connect("http://google.com").get();
Vous ne voulez vraiment pas exécuter des méthodes String de base ou même des expressions régulières sur HTML pour le traiter.
;)
NetworkOnMainThreadException
La réponse de Bill est très bonne, mais vous voudrez peut-être faire certaines choses avec la demande comme la compression ou les agents utilisateurs. Le code suivant montre comment vous pouvez différents types de compression pour vos demandes.
URL url = new URL(urlStr);
HttpURLConnection conn = (HttpURLConnection) url.openConnection(); // Cast shouldn't fail
HttpURLConnection.setFollowRedirects(true);
// allow both GZip and Deflate (ZLib) encodings
conn.setRequestProperty("Accept-Encoding", "gzip, deflate");
String encoding = conn.getContentEncoding();
InputStream inStr = null;
// create the appropriate stream wrapper based on
// the encoding type
if (encoding != null && encoding.equalsIgnoreCase("gzip")) {
inStr = new GZIPInputStream(conn.getInputStream());
} else if (encoding != null && encoding.equalsIgnoreCase("deflate")) {
inStr = new InflaterInputStream(conn.getInputStream(),
new Inflater(true));
} else {
inStr = conn.getInputStream();
}
Pour définir également l'agent utilisateur, ajoutez le code suivant:
conn.setRequestProperty ( "User-agent", "my agent name");
Eh bien, vous pouvez utiliser les bibliothèques intégrées telles que URL et URLConnection , mais elles ne donnent pas beaucoup de contrôle.
Personnellement, j'irais avec la bibliothèque Apache HTTPClient .
Edit: HTTPClient a été mis en fin de vie par Apache. Le remplacement est: Composants HTTP
Toutes les approches mentionnées ci-dessus ne téléchargent pas le texte de la page Web tel qu'il apparaît dans le navigateur. ces jours-ci, beaucoup de données sont chargées dans les navigateurs via des scripts dans des pages html. aucune des techniques mentionnées ci-dessus ne prend en charge les scripts, ils téléchargent uniquement le texte html. HTMLUNIT prend en charge les javascripts. donc si vous cherchez à télécharger le texte de la page Web tel qu'il apparaît dans le navigateur, vous devez utiliser HTMLUNIT .
Vous devrez probablement extraire du code d'une page Web sécurisée (protocole https). Dans l'exemple suivant, le fichier html est en cours d'enregistrement dans c: \ temp \ filename.html Enjoy!
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import javax.net.ssl.HttpsURLConnection;
/**
* <b>Get the Html source from the secure url </b>
*/
public class HttpsClientUtil {
public static void main(String[] args) throws Exception {
String httpsURL = "https://stackoverflow.com";
String FILENAME = "c:\\temp\\filename.html";
BufferedWriter bw = new BufferedWriter(new FileWriter(FILENAME));
URL myurl = new URL(httpsURL);
HttpsURLConnection con = (HttpsURLConnection) myurl.openConnection();
con.setRequestProperty ( "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:63.0) Gecko/20100101 Firefox/63.0" );
InputStream ins = con.getInputStream();
InputStreamReader isr = new InputStreamReader(ins, "Windows-1252");
BufferedReader in = new BufferedReader(isr);
String inputLine;
// Write each line into the file
while ((inputLine = in.readLine()) != null) {
System.out.println(inputLine);
bw.write(inputLine);
}
in.close();
bw.close();
}
}
Sur une machine Unix / Linux, vous pouvez simplement lancer 'wget' mais ce n'est pas vraiment une option si vous écrivez un client multiplateforme. Bien sûr, cela suppose que vous ne voulez pas vraiment faire grand-chose avec les données que vous téléchargez entre le moment de leur téléchargement et leur arrivée sur le disque.
Jetty a un client HTTP qui peut être utilisé pour télécharger une page Web.
package com.zetcode;
import org.eclipse.jetty.client.HttpClient;
import org.eclipse.jetty.client.api.ContentResponse;
public class ReadWebPageEx5 {
public static void main(String[] args) throws Exception {
HttpClient client = null;
try {
client = new HttpClient();
client.start();
String url = "http://www.something.com";
ContentResponse res = client.GET(url);
System.out.println(res.getContentAsString());
} finally {
if (client != null) {
client.stop();
}
}
}
}
L'exemple imprime le contenu d'une simple page Web.
Dans un didacticiel de lecture d'une page Web en Java, j'ai écrit six exemples de téléchargement d'une page Web par programmation en Java à l'aide d'URL, JSoup, HtmlCleaner, Apache HttpClient, Jetty HttpClient et HtmlUnit.
Obtenez de l'aide de cette classe pour obtenir du code et filtrer certaines informations.
public class MainActivity extends AppCompatActivity {
EditText url;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate( savedInstanceState );
setContentView( R.layout.activity_main );
url = ((EditText)findViewById( R.id.editText));
DownloadCode obj = new DownloadCode();
try {
String des=" ";
String tag1= "<div class=\"description\">";
String l = obj.execute( "http://www.nu.edu.pk/Campus/Chiniot-Faisalabad/Faculty" ).get();
url.setText( l );
url.setText( " " );
String[] t1 = l.split(tag1);
String[] t2 = t1[0].split( "</div>" );
url.setText( t2[0] );
}
catch (Exception e)
{
Toast.makeText( this,e.toString(),Toast.LENGTH_SHORT ).show();
}
}
// input, extrafunctionrunparallel, output
class DownloadCode extends AsyncTask<String,Void,String>
{
@Override
protected String doInBackground(String... WebAddress) // string of webAddress separate by ','
{
String htmlcontent = " ";
try {
URL url = new URL( WebAddress[0] );
HttpURLConnection c = (HttpURLConnection) url.openConnection();
c.connect();
InputStream input = c.getInputStream();
int data;
InputStreamReader reader = new InputStreamReader( input );
data = reader.read();
while (data != -1)
{
char content = (char) data;
htmlcontent+=content;
data = reader.read();
}
}
catch (Exception e)
{
Log.i("Status : ",e.toString());
}
return htmlcontent;
}
}
}
J'ai utilisé la réponse réelle à ce message ( url ) et j'ai écrit la sortie dans un fichier.
package test;
import java.net.*;
import java.io.*;
public class PDFTest {
public static void main(String[] args) throws Exception {
try {
URL oracle = new URL("http://www.fetagracollege.org");
BufferedReader in = new BufferedReader(new InputStreamReader(oracle.openStream()));
String fileName = "D:\\a_01\\output.txt";
PrintWriter writer = new PrintWriter(fileName, "UTF-8");
OutputStream outputStream = new FileOutputStream(fileName);
String inputLine;
while ((inputLine = in.readLine()) != null) {
System.out.println(inputLine);
writer.println(inputLine);
}
in.close();
} catch(Exception e) {
}
}
}