Tôi muốn có thể tìm nạp html của một trang web và lưu nó vào a String
, để tôi có thể thực hiện một số xử lý trên đó. Ngoài ra, làm thế nào tôi có thể xử lý các loại nén khác nhau.
Tôi sẽ làm điều đó bằng Java như thế nào?
Tôi muốn có thể tìm nạp html của một trang web và lưu nó vào a String
, để tôi có thể thực hiện một số xử lý trên đó. Ngoài ra, làm thế nào tôi có thể xử lý các loại nén khác nhau.
Tôi sẽ làm điều đó bằng Java như thế nào?
Câu trả lời:
Đây là một số mã đã thử nghiệm sử dụng lớp URL của Java . Tuy nhiên, tôi khuyên bạn nên làm công việc tốt hơn là xử lý các ngoại lệ hoặc chuyển chúng lên ngăn xếp cuộc gọi.
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
thành BufferedReader
. Và thay thế "dis = new DataInputStream(new BufferedInputStream(is));"
thành"dis = new BufferedReader(new InputStreamReader(is));"
InputStreamReader
?
Tôi muốn sử dụng một trình phân tích cú pháp HTML tốt như Jsoup . Sau đó, nó dễ dàng như:
String html = Jsoup.connect("http://stackoverflow.com").get().html();
Nó xử lý GZIP và các phản hồi phân đoạn và mã hóa ký tự hoàn toàn minh bạch. Nó cũng cung cấp nhiều lợi thế hơn, như duyệt qua HTML và thao tác bởi các bộ chọn CSS giống như jQuery có thể làm. Bạn chỉ phải lấy nó dưới dạng Document
, không phải như một String
.
Document document = Jsoup.connect("http://google.com").get();
Bạn thực sự không muốn chạy các phương thức String cơ bản hoặc thậm chí regex trên HTML để xử lý nó.
;)
NetworkOnMainThreadException
Câu trả lời của Bill rất hay, nhưng bạn có thể muốn thực hiện một số việc với yêu cầu như nén hoặc tác nhân người dùng. Đoạn mã sau đây cho thấy cách bạn có thể thực hiện nhiều kiểu nén khác nhau theo yêu cầu của mình.
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();
}
Để cũng đặt tác nhân người dùng, hãy thêm mã sau:
conn.setRequestProperty ( "User-agent", "my agent name");
Chà, bạn có thể sử dụng các thư viện tích hợp sẵn như URL và URLConnection , nhưng chúng không cung cấp nhiều quyền kiểm soát.
Cá nhân tôi muốn sử dụng thư viện Apache HTTPClient .
Chỉnh sửa: HTTPClient đã được Apache đặt để kết thúc vòng đời . Thay thế là: Thành phần HTTP
Tất cả các cách tiếp cận được đề cập ở trên không tải xuống văn bản trang web như trong trình duyệt. ngày nay, rất nhiều dữ liệu được tải vào các trình duyệt thông qua các tập lệnh trong các trang html. không có kỹ thuật nào được đề cập ở trên hỗ trợ tập lệnh, chúng chỉ tải xuống văn bản html mà thôi. HTMLUNIT hỗ trợ javascrip. vì vậy nếu bạn đang tìm cách tải xuống văn bản trang web giống như trong trình duyệt thì bạn nên sử dụng HTMLUNIT .
Rất có thể bạn cần trích xuất mã từ một trang web an toàn (giao thức https). Trong ví dụ sau, tệp html đang được lưu vào c: \ temp \ filename.html Hãy tận hưởng!
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();
}
}
Trên hộp Unix / Linux, bạn chỉ có thể chạy 'wget' nhưng đây không thực sự là một tùy chọn nếu bạn đang viết một ứng dụng khách đa nền tảng. Tất nhiên, điều này giả định rằng bạn không thực sự muốn làm gì nhiều với dữ liệu bạn tải xuống từ thời điểm tải xuống đến khi nó vào đĩa.
Jetty có một ứng dụng HTTP có thể được sử dụng để tải xuống một trang 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();
}
}
}
}
Ví dụ in nội dung của một trang web đơn giản.
Trong hướng dẫn Đọc trang web bằng Java, tôi đã viết sáu ví dụ về việc tải xuống một trang web theo chương trình trong Java bằng cách sử dụng URL, JSoup, HtmlCleaner, Apache HttpClient, Jetty HttpClient và HtmlUnit.
Nhận trợ giúp từ lớp này, nó lấy mã và lọc một số thông tin.
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;
}
}
}
Tôi đã sử dụng câu trả lời thực tế cho bài đăng này ( url ) và ghi đầu ra vào một tệp.
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) {
}
}
}