java - 用 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 代码
解决方案
学习使用 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
推荐阅读
- java - Java - Linux 上的命令行:运行代码后没有任何输出
- jquery - jQuery 从字符串列表中选择包含文本的元素(可能没有循环?)
- docusignapi - DocuSign:如何接收标头中的签名?
- delphi - Firemonkey ListView 滚动条可见性
- android - 如何从按钮中获取颜色?
- mysql - MySql 更新 JSON 值
- r - 有没有办法在 RStudio 中查看代码的“实时”计算?
- c++ - 在c ++中,如果一开始就禁止默认构造,那么禁止复制构造是否有意义?
- python - 如何使用 Web 应用程序处理大数据?
- regex - 使用星号作为分隔符,格式化捕获的数据