在Android中解析HTML


83

我正在尝试从网页中解析android中的HTML,由于该网页的格式不正确,我得到了SAXException

有没有一种方法可以在Android中解析HTML?


我怀疑Rhino依赖项将使htmlunit难以在Android上编译,但是您可以尝试...此外,其他一些非严格的HTML解析器(例如汤)也可以工作。
alex

我想知道是否可以在这里使用webkit。
ziya 2010年

Answers:


71

我刚遇到这个问题。我尝试了一些事情,但决定使用JSoup。这个jar大约是132k,这有点大,但是如果您下载源代码并删除一些您不会使用的方法,那么它就不会那么大。
=>关于它的好处是它将处理格式错误的HTML

这是他们网站上的一个很好的例子。

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
您可以尝试包括完整的jar,然后在生产版本中的应用程序上运行ProGuard,以清除未使用的代码。
Andrew Mackenzie

3
注意:JSoup非常慢。
凯文2014年

@kevin该说法的来源?您可能启用了一些调试功能。
goetzc

在客户端呈现html页面期间使用Java脚本动态加载内容怎么办?Jsoup也将显示此内容吗?
MikeL '16

56

您是否尝试过使用Html.fromHtml(source)

我认为该类在源质量方面相当宽松(它在内部使用TagSoup,该类在设计时考虑到了现实生活中的不良HTML)。虽然它不支持所有HTML标记,但是它确实带有一个处理程序,您可以实现该处理程序以对不了解的标记进行反应。


1
这很简单,我无法搜索确切的内容(例如XPATH)

请注意。这将“挂起所有线程”。我面对比当它带有html格式文本的json。正确显示html文本没有问题,但是使用html.fromhtml()之后,我遇到了这个问题。
大卫,

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

漂亮简单,没有插件,喜欢它!tnxs
RonEskinder

1
请注意:调用从返回toString()Spanned对象Html.fromHtml(str)会使许多HTML标签不起作用(包括<i> <u> <b>)。因此,如果您要设置textview,请执行以下操作:myTextView.setText(Html.fromHtml(str))
Sakiboy

@Sakiboy你是对的。除此之外,还有许多其他标签无法使用Html.fromHtml()

太棒了,正是我想要的,我的服务器端开发人员正在向我发送html,现在我可以轻松地将其转换为原始字符串了
Zulqurnain Jutt

3

我们都知道编程具有无限的可能性。有许多解决方案可解决一个问题,因此我认为上述所有解决方案都是完美的,可能对某人有所帮助,但对我而言,这可以节省我的时间。

所以代码像这样

  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();
  }

您只需要在onCreate Method您的计算机中调用上述函数MainActivity

我希望这对你们也有帮助。

另请阅读Medium中的原始博客


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.