首页 > 解决方案 > 用 Java 解析一个简单的 HTML

问题描述

如何解析html的一部分?例如,我想显示“这里是 OL 列表项:”

示例“file.html”:

<h1>Heading 1</h1>
<h2>Heading 2</h2>
<p>This is some html. Look, here's an <u>underline</u>.</p>
<p>Look, this is <em>emphasized.</em> And here\\'s some <b>bold</b>.</p>
<p>Here are UL list items:
<ul>
    <li>One</li>
    <li>Two</li>
    <li>Three</li>
</ul>
<p>Here are OL list items:
<ol>
    <li>One</li>
    <li>Two</li>
    <li>Three</li>
</ol>

我尝试的是

webView.loadUrl("file:///android_asset/file.html");

但它显示了整个 html 代码

标签: javahtml

解决方案


学习使用 JSoup 在 Android 上解析 HTML 页面

当您制作 Android 应用程序时,您可能必须解析从 Web 获取的 HTML 数据或 HTML 页面。在 Java 中最知名的解决方案之一是使用 JSoup 库。正如 JSoup 官方网站上所说:“它是一个用于处理真实世界 HTML 的 Java 库。它提供了一个非常方便的 API,用于提取和操作数据,使用最好的 DOM、CSS 和类似 jquery 的方法。”</p>

JSoup 可以在 Android 应用程序中使用,我们将研究如何在 Android 上使用 JSoup 解析 HTML 页面。您可以在 Youtube 上的视频中找到教程:

https://www.youtube.com/watch?v=BqMIcugsCFc

首先,您需要在 Gradle 构建文件中添加 JSoup 依赖项:

compile 'org.jsoup:jsoup:1.10.1'

对于我们的示例,我们将下载 SSaurel 博客的内容并显示主页的所有链接。为了下载网站的内容,JSoup 提供了 connect 方法和 get 方法。最后一种方法是同步工作的。所以,我们应该在一个单独的线程中调用这些方法。我们的应用程序将只有一个简单的布局,其中包含一个用于启动网站下载的 Button 和一个用于显示链接的 TextView。

它将具有以下形式:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:id="@+id/activity_main"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:paddingBottom="@dimen/activity_vertical_margin"
  android:paddingLeft="@dimen/activity_horizontal_margin"
  android:paddingRight="@dimen/activity_horizontal_margin"
  android:paddingTop="@dimen/activity_vertical_margin"
  tools:context="com.ssaurel.jsouptut.MainActivity">

  <Button
    android:id="@+id/getBtn"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Get website"
    android:layout_marginTop="50dp"
    android:layout_centerHorizontal="true"/>

  <TextView
    android:id="@+id/result"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Result ..."
    android:layout_centerHorizontal="true"
    android:layout_marginTop="30dp"
    android:layout_below="@id/getBtn"
    android:textSize="17sp"/>
</RelativeLayout>

在应用程序的主 Activity 中,我们将从布局中获取 Button 和 TextView 的实例。然后,我们在 Button 上设置一个点击监听器,当用户点击它时开始下载网站。

在 getWebsite() 方法中,我们创建一个新的 Thread 来下载网站的内容。我们使用 Jsoup 对象的 connect() 方法将应用程序连接到网站,然后调用 get() 方法下载内容。这些调用返回一个 Document 对象实例。我们必须用查询调用这个实例的 select() 方法来获取内容的所有链接。此查询返回一个 Elements 实例,最后,我们只需迭代此对象中包含的元素,以将每个链接的内容显示到屏幕上。

在我们分离的线程结束时,我们使用从网站获取的链接刷新 UI。此刷新嵌入在 runOnUiThread 调用中,因为禁止在单独的线程中刷新 UI 元素。

MainActivity 的代码具有以下形式:

package com.ssaurel.jsouptut;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

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 AppCompatActivity {

  private Button getBtn;
  private TextView result;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    result = (TextView) findViewById(R.id.result);
    getBtn = (Button) findViewById(R.id.getBtn);
    getBtn.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View view) {
        getWebsite();
      }
    });
  }

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

最后一步是运行应用程序并在屏幕上显示 SSaurel 博客的所有链接来享受最终结果:

在此处输入图像描述

https://medium.com/@ssaurel/learn-to-parse-html-pages-on-android-with-jsoup-2a9b0da0096f


推荐阅读