Phân tích cú pháp HTML trong Android


83

Tôi đang cố gắng phân tích cú pháp HTML trong android từ một trang web và vì trang web đó không được hình thành tốt nên tôi nhận được SAXException.

Có cách nào để phân tích cú pháp HTML trong Android không?


Tôi nghi ngờ sự phụ thuộc của Rhino sẽ khiến htmlunit trở thành địa ngục để biên dịch trên Android, nhưng bạn có thể thử ... Ngoài ra, một số trình phân tích cú pháp HTML không nghiêm ngặt khác như súp có thể hoạt động.
alex

Tôi tự hỏi nếu webkit có thể được sử dụng ở đây.
ziya

Câu trả lời:


71

Tôi vừa gặp phải vấn đề này. Tôi đã thử một vài điều, nhưng vẫn ổn định bằng cách sử dụng JSoup . Hũ khoảng 132k, hơi to nhưng nếu tải nguồn về và lấy ra mấy cái phương pháp không dùng được thì cũng không lớn bằng.
=> Điều tốt về nó là nó sẽ xử lý HTML được định dạng xấu

Đây là một ví dụ điển hình từ trang web của họ.

File input = new File("/tmp/input.html");
Document doc = Jsoup.parse(input, "UTF-8", "http://example.com/");

//http://jsoup.org/cookbook/input/load-document-from-url
//Document doc = Jsoup.connect("http://example.com/").get();

Element content = doc.getElementById("content");
Elements links = content.getElementsByTag("a");
for (Element link : links) {
  String linkHref = link.attr("href");
  String linkText = link.text();
}

1
Bạn có thể thử bao gồm cả jar đầy đủ và chạy ProGuard trên ứng dụng của bạn trong bản phát hành sản xuất để loại bỏ mã không sử dụng.
Andrew Mackenzie

3
THẬN TRỌNG: JSoup rất chậm.
kevin

@kevin một nguồn cho tuyên bố đó? Bạn có thể đã bật một số gỡ lỗi.
goetzc

Còn nội dung được tải động bằng java script trong quá trình hiển thị trang html ở phía máy khách thì sao? Jsoup cũng sẽ hiển thị nội dung này chứ?
MikeL

56

Bạn đã thử sử dụng Html.fromHtml (nguồn) chưa?

Tôi nghĩ rằng lớp đó khá tự do đối với chất lượng nguồn (nó sử dụng TagSoup bên trong, được thiết kế với HTML thực tế, có tính chất xấu). Tuy nhiên, nó không hỗ trợ tất cả các thẻ HTML, nhưng nó đi kèm với một trình xử lý mà bạn có thể triển khai để phản ứng trên các thẻ mà nó không hiểu.


1
Điều này rất đơn giản, tôi không thể tìm kiếm những thứ chính xác (như XPath)

xin vui lòng chú ý. điều này sẽ "Tạm dừng tất cả các chủ đề". Tôi phải đối mặt với hơn khi nhận được một json với văn bản định dạng html với trong đó. không có vấn đề gì với việc hiển thị đúng văn bản html nhưng sau khi sử dụng html.fromhtml () tôi phải đối mặt với điều này.
David

23
String tmpHtml = "<html>a whole bunch of html stuff</html>";
String htmlTextStr = Html.fromHtml(tmpHtml).toString();

đẹp và đơn giản, không có plugin, yêu nó! tnxs
RonEskinder

1
Là một lưu ý: gọi toString()trên Spannedđối tượng trở về từ Html.fromHtml(str)sẽ làm cho rất nhiều các HTMLthẻ không hoạt động (bao gồm <i> <u> <b>). Vì vậy, nếu bạn đang đặt chế độ xem văn bản, chỉ cần làm:myTextView.setText(Html.fromHtml(str))
Sakiboy

@Sakiboy Bạn nói đúng. Ngoài thẻ này ra còn có nhiều thẻ khác không hoạt động với Html.fromHtml(). Hãy xem điều này qua stackoverflow.com/a/3150456/1987045
Rahul Raveendran.

tuyệt vời, chính xác những gì tôi muốn, dev phía máy chủ của tôi đã gửi cho tôi html, bây giờ tôi có thể dễ dàng chuyển đổi nó để nguyên chuỗi nhờ
Zulqurnain Jutt

3

Tất cả chúng ta đều biết rằng lập trình có vô vàn khả năng.

Vì vậy, Code diễn ra như thế này

  private void getWebsite() {
    new Thread(new Runnable() {
      @Override
      public void run() {
        final StringBuilder builder = new StringBuilder();

        try {
          Document doc = Jsoup.connect("http://www.ssaurel.com/blog").get();
          String title = doc.title();
          Elements links = doc.select("a[href]");

          builder.append(title).append("\n");

          for (Element link : links) {
            builder.append("\n").append("Link : ").append(link.attr("href"))
            .append("\n").append("Text : ").append(link.text());
          }
        } catch (IOException e) {
          builder.append("Error : ").append(e.getMessage()).append("\n");
        }

        runOnUiThread(new Runnable() {
          @Override
          public void run() {
            result.setText(builder.toString());
          }
        });
      }
    }).start();
  }

Bạn chỉ cần gọi hàm trên trong onCreate Methodcủa bạnMainActivity

Tôi hy vọng cái này cũng hữu ích cho các bạn.

Cũng đọc blog gốc tại Medium


1

Có thể bạn có thể sử dụng WebView, nhưng như bạn thấy trong tài liệu WebView không hỗ trợ javascript và những thứ khác như widget theo mặc định.

http://developer.android.com/reference/android/webkit/WebView.html

Tôi nghĩ rằng bạn có thể kích hoạt javascript nếu bạn cần.


4
Có, bạn có thể kích hoạt JS một cách dễ dàng. Nhưng không cần sử dụng webview để phân tích cú pháp html.
Guy

1
Điều đó không trả lời câu hỏi
luckyhandler
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.