Bir web sayfasının html'sini alıp bir olarak kaydedebilmek String
istiyorum, böylece üzerinde bazı işlemler yapabilirim. Ayrıca, çeşitli sıkıştırma türleriyle nasıl başa çıkabilirim.
Bunu Java kullanarak nasıl yapacağım?
Bir web sayfasının html'sini alıp bir olarak kaydedebilmek String
istiyorum, böylece üzerinde bazı işlemler yapabilirim. Ayrıca, çeşitli sıkıştırma türleriyle nasıl başa çıkabilirim.
Bunu Java kullanarak nasıl yapacağım?
Yanıtlar:
İşte Java'nın URL sınıfını kullanan bazı test edilmiş kodlar . Yine de, istisnaları ele almak veya çağrı yığınını aktarmak için burada yaptığımdan daha iyi bir iş yapmanızı öneririm.
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
için BufferedReader
. Ve şu şekilde değiştirin "dis = new DataInputStream(new BufferedInputStream(is));"
:"dis = new BufferedReader(new InputStreamReader(is));"
InputStreamReader
?
Jsoup gibi düzgün bir HTML ayrıştırıcı kullanırım . O zaman şu kadar kolaydır:
String html = Jsoup.connect("http://stackoverflow.com").get().html();
GZIP ve yığın yanıtları ve karakter kodlamasını tamamen şeffaf bir şekilde işler. Ayrıca jQuery'nin yapabildiği gibi CSS seçiciler tarafından HTML geçişi ve manipülasyonu gibi daha fazla avantaj da sunar . Bir olarak Document
değil, sadece olarak yakalamalısın String
.
Document document = Jsoup.connect("http://google.com").get();
Gerçekten yok temel String yöntemlerini çalıştırmak veya hatta bunu işlemek için HTML regex istiyorum.
;)
NetworkOnMainThreadException
Bill'in cevabı çok güzel, ancak istekte sıkıştırma veya kullanıcı aracıları gibi bazı şeyler yapmak isteyebilirsiniz. Aşağıdaki kod, isteklerinize çeşitli sıkıştırma türlerini nasıl yapabileceğinizi gösterir.
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();
}
Kullanıcı aracısını da ayarlamak için aşağıdaki kodu ekleyin:
conn.setRequestProperty ( "User-agent", "my agent name");
URL ve URLConnection gibi yerleşik kitaplıklarla gidebilirsiniz , ancak çok fazla kontrol sağlamazlar.
Şahsen ben Apache HTTPClient kitaplığı ile giderdim .
Düzenleme: HTTPClient, Apache tarafından kullanım ömrünün sonuna ayarlandı . Bunun yerine: HTTP Bileşenleri
Yukarıda belirtilen tüm yaklaşımlar, web sayfası metnini tarayıcıda göründüğü gibi indirmez. Bu günlerde tarayıcılara html sayfalarındaki komut dosyaları aracılığıyla çok fazla veri yüklenmektedir. Yukarıda bahsedilen tekniklerin hiçbiri komut dosyalarını desteklemez, sadece html metnini indirirler. HTMLUNIT, javascripts'i destekler. bu yüzden, web sayfası metnini tarayıcıda göründüğü gibi indirmek istiyorsanız, HTMLUNIT kullanmalısınız .
Büyük olasılıkla güvenli bir web sayfasından (https protokolü) kod çıkarmanız gerekir. Aşağıdaki örnekte, html dosyası c: \ temp \ dosyaadı.html içine kaydedilmektedir. Keyfini çıkarın!
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();
}
}
Bir Unix / Linux kutusunda sadece 'wget' çalıştırabilirsiniz, ancak bir çapraz platform istemcisi yazıyorsanız bu gerçekten bir seçenek değildir. Elbette bu, indirdiğiniz verilerle, indirme noktasıyla diske vurma noktası arasında fazla bir şey yapmak istemediğinizi varsayar.
Jetty, bir web sayfasını indirmek için kullanılabilen bir HTTP istemcisine sahiptir.
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();
}
}
}
}
Örnek, basit bir web sayfasının içeriğini yazdırır.
Bir de Java Okuma bir web sayfası ben URL'yi JSoup, HtmlCleaner, Apaçi HttpClient İskele HttpClient ve HtmlUnit'in kullanarak Java programmaticaly bir web sayfası geçir altı örneklerini yazdım öğretici.
Bu sınıftan yardım alın, kod alır ve bazı bilgileri filtreler.
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;
}
}
}
Bu yazının asıl cevabını ( url ) kullandım ve çıktıyı bir dosyaya yazdım .
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) {
}
}
}