Java中使用jsoup解析HTML

时间:2022-10-31 23:43:27


1、引言:什么是jsoup?

jsoup是java世界里面的一份子,它是用来对html文档进行解析的工具类。它的用途很多,比如我们要解析某个网站上的一些资源?再或者我们在CSDN上输入一段html的代码,那么编辑器如何识别?这个时候就会有类似jsoup这样的工具来帮我们做这种事情。在以java为主的语言中,jsoup是公认做得最好的。


2、解析一个html文档

当我们的都一个html文档,可以使用静态Jsoup.parse(String html) 方法或 Jsoup.parse(String html, String baseUri)类进行解析。

下文是一段简单的示例代码:

String html = "<html><head><title>First parse</title></head>"
+ "<body><p>Parsed HTML into a doc.</p></body></html>";
Document doc = Jsoup.parse(html);

注意:解析的不能是空字符串,其中包含(至少) 一个head和一个body元素。


3、解析一个body片断

有时候,我们不能得到一个完整的html文档,或者说条件限制,我们不需要得到一个完整的html文档,只需要其中的部分。那么,这个时候我们又该如何处理呢?

这里,jsoup为我们提供了Jsoup.parseBodyFragment(String html)方法.

下文是一段简单的示例代码:

String html = "<div><p>This is an example!</p>";
Document doc = Jsoup.parseBodyFragment(html);
Element body = doc.body();

4、加载一个网页

加载网页是我们在解析html文档时候最常用的,比如,在Android应用中,我么可以根据某内容网站提供的东西,解析他的网站布局,然后得到一些有用的信息。

嘿嘿,我曾经这么做过,解析效果还行。在jsoup中,提供了一个静态方法Jsoup.connect(String url);

下文是一段简单的示例代码:

// 仅以百度首页为例
Document doc = Jsoup.connect("http://www.baidu.com/").get();
String title = doc.title();

5、加载本地文档

在Android开发过程中,我们有一些页面上的功能,是不需要联网的,但是数据需要展示给用户,而这些数据也不是很重要,没必要存在数据库中。有经验的开发人员应该已经知道我说的是什么了,没错,这就是用户协议、用户须知以及关于我们等软件中的信息。

这个时候,我们可以使用网页的方式,直接存储在本地的Assest目录下,作为一个html文档即可。

jsoup为我们提供了Jsoup.parse(File in, String charsetName, String baseUri)方法:

File input = new File("/tmp/index.html");
Document doc = Jsoup.parse(input, "UTF-8", null);
注意:baseUri 参数用于解决文件中URLs是相对路径的问题。如果不需要可以传入一个空的字符串。


6、使用Dom解析文档

在开发过程中,单纯的加载网页还是比较少的,更多的时候,我们需要解析一下这个文档中的内容,提取我们需要的数据,这里,jsoup提供了一系列的方法,我简单摘抄如下:

//查找元素
getElementById(String id)
getElementsByTag(String tag)
getElementsByClass(String className)
getElementsByAttribute(String key) (and related methods)

//元素数据
attr(String key)获取属性attr(String key, String value)设置属性
attributes()获取所有属性
text()获取文本内容text(String value) 设置文本内容
html()获取元素内HTMLhtml(String value)设置元素内的HTML内容
outerHtml()获取元素外HTML内容

7、获取元素的值

当我们得到一些属性之后,我们还需要得到其中的值,比如图片地址,文本描述等信息,这里,jsoup也为我们提供了一些方法:

要取得一个属性的值,可以使用Node.attr(String key) 方法
对于一个元素中的文本,可以使用Element.text()方法
对于要取得元素或属性中的HTML内容,可以使用Element.html(), 或 Node.outerHtml()方法


8、完整示例

上面介绍的一些jsoup的使用方法,已经足够使用了,这里我们再提供一个完整的示例如下:

import org.jsoup.Jsoup;
import org.jsoup.helper.Validate;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.io.IOException;

/**
* Example program to list links from a URL.
*/
public class ListLinks {
public static void main(String[] args) throws IOException {
Validate.isTrue(args.length == 1, "usage: supply url to fetch");
String url = args[0];
print("Fetching %s...", url);

Document doc = Jsoup.connect(url).get();
Elements links = doc.select("a[href]");
Elements media = doc.select("[src]");
Elements imports = doc.select("link[href]");

print("\nMedia: (%d)", media.size());
for (Element src : media) {
if (src.tagName().equals("img"))
print(" * %s: <%s> %sx%s (%s)",
src.tagName(), src.attr("abs:src"), src.attr("width"), src.attr("height"),
trim(src.attr("alt"), 20));
else
print(" * %s: <%s>", src.tagName(), src.attr("abs:src"));
}

print("\nImports: (%d)", imports.size());
for (Element link : imports) {
print(" * %s <%s> (%s)", link.tagName(),link.attr("abs:href"), link.attr("rel"));
}

print("\nLinks: (%d)", links.size());
for (Element link : links) {
print(" * a: <%s> (%s)", link.attr("abs:href"), trim(link.text(), 35));
}
}

private static void print(String msg, Object... args) {
System.out.println(String.format(msg, args));
}

private static String trim(String s, int width) {
if (s.length() > width)
return s.substring(0, width-1) + ".";
else
return s;
}
}

9、更多介绍

更多介绍,可以参考jsoup官方网站