【问题标题】:JSoup Parse HTML for Webview用于 Webview 的 JSoup 解析 HTML
【发布时间】:2016-06-30 00:19:26
【问题描述】:

我需要在 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


    【解决方案1】:

    用这个替换你的 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();
    }
    

    【讨论】:

    • 感谢您的回复。不幸的是,我的模拟器仍然显示为空。
    【解决方案2】:

    这并不是真正特定于 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(请参阅 here),看看是否有任何异常,尤其是 NetworkOnMainThreadException(您可能会遇到这种情况,请参阅 here。)

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

    【讨论】:

    • 感谢您的回复。同样的问题仍然存在,我的 WebView 显示为空。 WebView 可见且已添加 Internet 权限。 LogCat 中没有 NetworkOnMainThreadException。相反,我得到:
    • 03-19 12:49:40.466 26845-26870/com.example.john_000.jsouptest W/EGL_emulation:eglSurfaceAttrib 未实现 03-19 12:49:40.466 26845-26870/com.example。 john_000.jsouptest W/OpenGLRenderer:无法在表面 0xaec38740 上设置 EGL_SWAP_BEHAVIOR,错误 = EGL_SUCCESS 03-19 12:49:40.506 26845-26845/com.example.john_000.jsouptest W/ViewRootImpl:由于没有窗口焦点而丢弃事件:KeyEvent { action=ACTION_DOWN, keyCode=KEYCODE_ALT_RIGHT, scanCode=100, metaState=META_ALT_ON|META_ALT_RIGHT_ON, flags=0x8, repeatCount=54637, eventTime=4124943, downTime=1295252, deviceId=1, source=0x301 }
    • @GeneralDisorder,嗯,这似乎与 Jsoup 无关。我将在真实设备上尝试您的代码并进行检查。同时,尝试将预定义的字符串加载到您的 WebView 中,即。像这样:cardapio.loadData("Some text", "text/html", "UTF-8");。您的 WebView 仍然是空白的,还是显示了什么?在这种情况下,代码中的 Jsoup 部分无法正常工作。还可以尝试将您的数据/文本输出到 LogCat,例如使用System.out.println(data)。你在 LogCat 中得到了什么?
    • 当我输入 cardapio.loadData("Some text", "text/html", "UTF-8");我的 webview 仍然是空的。我几乎可以肯定我有 Jsoup 设置。我将我的 jsoup-1.8.3.jar 文件放在 libs 中,并将“编译文件('libs/jsoup-1.8.3.jar')”添加到 app build.gradle。
    • 这是 'cardapio.loadData("Some text", "text/html", "UTF-8");' 的样子添加在imgur.com/Qag3ONx
    猜你喜欢
    • 2011-12-11
    • 1970-01-01
    • 1970-01-01
    • 2012-11-06
    • 1970-01-01
    • 2013-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多