JSoup为Webview解析HTML

最后发布: 2016-03-14 19:29:55


问题

我需要在Android Studio的Webview中显示页面的一部分,该部分包含PDF。 这是我需要的网站https://www.limerick.ie/council/weekly-planning-lists ,我要显示的部分是http://i.imgur.com/S9Pwjte.png?1当我尝试时要运行我的代码,Webview不会显示任何内容,而是空白。

这是我的代码

package com.example.john_000.jsouptest;

import android.app.Activity;
import android.os.Bundle;
import android.webkit.WebView;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.IOException;

public class MainActivity extends Activity {
 public class HtmlParserActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        WebView cardapio = (WebView) findViewById(R.id.webView);
        cardapio.getSettings().setJavaScriptEnabled(true);
        String data = "";
        Document doc = null;
        try {
            doc = Jsoup.connect("https://www.limerick.ie/council/weekly-planning-lists").get();
            Elements elements = doc.getElementsByClass("block-inner clearfix");
            for (Element element : elements) {
                data += element.outerHtml();
                data += "<br/>";
            }
            cardapio.loadData(data, "text/html", "UTF-8");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
 }
}

如果有人知道如何解析此HTML,以便我仅显示所需的表,将非常感谢您的帮助。

java android html html-parsing jsoup
回答

将此替换为try-catch块:

try {
    doc = Jsoup.connect("https://www.limerick.ie/council/weekly-planning-lists").get();
    Elements elements = doc.select("div.block-inner.clearfix");
    for (Element element : elements) {
        if (!element.select("tbody").isEmpty()) {
            data = element.outerHtml() + "<br/>";
            break;
        }
    }
    cardapio.loadData(data, "text/html", "UTF-8");
} catch (IOException e) {
    e.printStackTrace();
}


回答

这并不是真正针对Android的(不需要我的android设备),但这在Java上有效:

String url = "https://www.limerick.ie/council/weekly-planning-lists";

Document document = Jsoup.connect(url).get();
Element div = document.select("table.sticky-enabled").first();

String text = div.outerHtml();
System.out.println(text);

并产生以下输出:

<table class="sticky-enabled"> 
 <thead>
  <tr>
   <th>Attachment</th>
   <th>Size</th> 
  </tr>
 </thead> 
 <tbody> 
  <tr class="odd">
   <td><span class="file"><img class="file-icon" alt="PDF icon" title="application/pdf" src="/modules/file/icons/application-pdf.png"> <a href="https://www.limerick.ie/sites/default/files/260216_applications_refused.pdf" type="application/pdf; length=6526" title="260216_applications_refused.pdf">26/02/16 Applications Refused</a></span></td>
   <td>6.37 KB</td> 
  </tr> 
  <tr class="even">
   <td><span class="file"><img class="file-icon" alt="PDF icon" title="application/pdf" src="/modules/file/icons/application-pdf.png"> <a href="https://www.limerick.ie/sites/default/files/260216_applications_granted.pdf" type="application/pdf; length=20585" title="260216_applications_granted.pdf">26/02/16 Applications Granted</a></span></td>
   <td>20.1 KB</td> 
[...]

因此,在您的代码中,您可以替换

Elements elements = doc.getElementsByClass("block-inner clearfix");
for (Element element : elements) {
    data += element.outerHtml();
    data += "<br/>";
}

data = doc.select("table.sticky-enabled").first().outerHtml();

这将为您提供完整的表格。

并且您的data字符串将包含表的完整HTML,然后您可以像以前一样将其加载到WebView中。 请注意,如果像这样将原始HTML加载到WebView中,它将没有任何格式或样式,因为未加载样式表(CSS)。

如果不起作用:

  • 确保您的WebView在布局中可见。

  • 确保已将“ Internet”权限添加到AndroidManifest.xml。

  • 查看LogCat(请参阅此处 ),看看是否有任何异常,尤其是NetworkOnMainThreadException (您可能会得到的例外,请参见此处)

让我知道它是否有效,如果无效,我将在Android设备上尝试看看。