Parsing HTML In Android With Jsoup
Trong bài viết này, tôi muốn miêu tả làm thế nào để sử dụng Jsoup trong Android. Jsoup là một thư viện của java để giúp chúng ta trích xuất và thao tác HMTL file. Sử dụng thư viện này chúng ta có thể phân tích trang HTML vào trong Android. Có một vài tình huống khi chúng ta muôn phân tích ...
Trong bài viết này, tôi muốn miêu tả làm thế nào để sử dụng Jsoup trong Android. Jsoup là một thư viện của java để giúp chúng ta trích xuất và thao tác HMTL file. Sử dụng thư viện này chúng ta có thể phân tích trang HTML vào trong Android.
Có một vài tình huống khi chúng ta muôn phân tích và trích xuất một vài thông tin từ trang HTML thay vì thể hiện toàn bộ nó. Trong trường hợp này chúng ta có thể sử dụng Jsoup, với các API mạnh mẽ rất dễ dàng cho việc sử dụng và tích hợp vào trong project Android. Trong bài viết này chúng tôi sẽ thảo luận làm thế nào setup và sử dụng Jsoup , làm sao để trích xuất một vài thông tin.
Giới thiệu Jsoup
Như đã nói Jsoup là một thư viện của Java để cung câp một bộ các API cho việc trích xuất và thao tác các file HTML . Có một vài phương thức cho việc đọc và phân tích một trang HTML , trong trường hợp của chúng ta, chúng ta muốn lấy một vài thông tin từ một trang HTML trên server ở xa và chúng ta phải cung cấp một URL. Nếu chúng ta muốn phân tích trang như là DOM, chúng ta có:
Document doc = Jsoup.connect(URL).get();
doc là một biến thuộc class Document để lưu trữ những tài liệu đã được lấy về. Bây giờ chúng ta đã có Document và chúng ta có thể tự do trích xuất thông tin. Chúng ta có thể lấy title và những thông tin khác đang được sử dụng trong các** Tag HTML** Cho ví dụ, nếu chúng ta muốn lấy tất cả các tag có tên là** meta **:
Elements metaElems = doc.select("meta");
Phương thức select được sử dụng khi chúng ta muốn lấy về những tag đang sử dụng truy vấn CSS . Cho ví dụ, nếu chúng ta muốn lấy giá trị thuộc tính từ một tag :
String name = metaElem.attr("name");
name ở đây là tên thuộc tính. Hơn nữa, Chúng ta có thể lựa chọn tất cả các thành phần trong một trang HTML có một giá trị CSS xác định. Cho ví dụ, trong website có một vài thành phần có một class CSS tên là **“topic" **, vậy chúng tao có.
Elements topicList = doc.select("h2.topic");
Thiết lập project và tích hợp Jsoup
Đầu tiên chúng ta cần làm là tạo một **project Android ** có chứa một Activity đơn giản. Tôi sẽ giả sử rằng bạn đang sử dụng Android Studio trong phát triển ứng dụng Android. Khi bạn đã tạo một project android, bạn phải add Jsoup như là một dependency libary. Vậy mở file **build.gradle ** và add thêm một **dependency libary **như bên dưới.
compile 'org.jsoup:jsoup:1.7.3'
Vậy chúng ta có :
dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:19.+' compile 'org.jsoup:jsoup:1.7.3' }
Tạo một ứng dụng phân tich trang HTML
Khi chúng ta đã biết những thông tin cơ bản về các API của Jsoup. Chúng ta có thể bắt đầu code ứng dụng của chúng ta. Việc đầu tiên chúng ta cần làm là việc gọi một **website **, vậy chúng ta không thể sử dụng các API của **Jsoup **trong main thread vì nếu làm vậy chúng ta sẽ gặp phải một lỗi rất nghiệm trọng trong Android là ANR , do đó trong ví dụ này chúng ta nên sử dụng AsyncTask. Chúng ta sẽ thiêt kế layout của App rất dơn giản bâo gồm một EditText cho việc insert URL , một Button dùng để khởi động việc phân tích html và một EditText dùng để hiển thị kết quả.
Trong MainActivitychúng ta có:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final EditText editUrl = (EditText)findViewById(R.id.editURL); Button buttonGetData = (Button)findViewById(R.id.button_get_data); resultText = (EditText)findViewById(R.id.edit_result); buttonGetData.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String siteUrl = editUrl.getText().toString(); new PareseURL().execute(new String[]{siteUrl}); } }); }
PareURL là một class mở rộng từ AsyncTask cho việc phân tích file HTML sử dụng Jsoup như hiển thị bên dưới:
private class PareseURL extends AsyncTask<String, Void, String>{ @Override protected void onPreExecute() { super.onPreExecute(); showProgessDialog(); } @Override protected String doInBackground(String... params) { StringBuffer buffer = new StringBuffer(); try { Document document = Jsoup.connect(params[0]).get(); // Get document (HTML page) title String title = document.title(); buffer.append("Title:" + title + " "); // Get meta info Elements metaElems = document.select("meta"); buffer.append("META DATA "); for (Element metaElem : metaElems) { String name = metaElem.attr("name"); String content = metaElem.attr("content"); buffer.append("name ["+name+"] - content ["+content+"] "); } Elements topicList = document.select("h2.topic"); buffer.append("Topic list "); for (Element topic : topicList) { String data = topic.text(); buffer.append("Data ["+data+"] "); } } catch (IOException e) { e.printStackTrace(); } return buffer.toString(); } @Override protected void onPostExecute(String s) { super.onPostExecute(s); hideProgressDialog(); if (s != null){ resultText.setText(s); } else { resultText.setText("Error ?"); } } }
Khi bạn chạy ứng dụng bạn sẽ nhận được kết quả như bên dưới:
Bạn có thể muốn download source code tại đây.