jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据。
jsoup 的主要功能如下:
其中,要被解析的HTML可以是一个HTML
的字符串,可以是一个URL
,可以是磁盘上的一个普通文件
。
org.jsoup.Jsoup把输入的HTML转换成一个org.jsoup.nodes.Document对象,然后从Document对象中取出想要的元素。
org.jsoup.nodes.Document继承了org.jsoup.nodes.Element,Element又继承了org.jsoup.nodes.Node类。里面提供了丰富的方法来获取HTML的元素。
下面是几种常见的应用场景举例说明 jsoup 是如何进行 HTML 文档处理的。
jsoup 可以从包括字符串、URL 地址以及本地文件来加载 HTML 文档,并生成 Document 对象实例。
// 直接从字符串中输入 HTML 文档
String html = "<html><head><title> 开源中国社区 </title></head>"
+ "<body><p> 这里是 jsoup 项目的相关文章 </p></body></html>";
Document doc = Jsoup.parse(html);
Document doc = Jsoup.connect("http://www.oschina.net/").get();
String title = doc.title();
其中Jsoup.connect(“xxx”)方法返回一个org.jsoup.Connection对象。
在Connection对象中,我们可以执行get或者post来执行请求。
但是在执行请求之前我们可以使用Connection对象来设置一些请求信息。比如:头信息,cookie,请求等待时间,代理等等来模拟浏览器的行为。
Document doc = Jsoup.connect("http://www.oschina.net/")
.data("query", "Java")// 请求参数,传参
.userAgent("Mozilla")// 设置 User-Agent ,伪装成浏览器
.cookie("auth", "token")// 设置 cookie,添加cookie信息
.timeout(3000)// 设置连接超时时间
.post();// 使用 POST 方法访问 URL
//从本地文件中,通过Id,获取下面的标签
File input = new File("E:/test.html");
Document doc = Jsoup.parse(input, "UTF-8");
这部分涉及一个 HTML 解析器最基本的功能,但 jsoup 使用一种有别于其他开源项目的方式——选择器,不过 jsoup 也提供了传统的 DOM 方式的元素解析。
//从本地文件中,通过Id,获取下面的标签
File input = new File("E:/test.html");
Document doc = Jsoup.parse(input, "UTF-8");
Element content = doc.getElementById("content");
Elements links = content.getElementsByTag("a");
for (Element link : links) {
String linkHref = link.attr("href");
String linkText = link.text();
}
可能会觉得 jsoup 的方法似曾相识,没错,像 getElementById 和 getElementsByTag 方法跟 JavaScript 的方法名称是一样的,功能也完全一致。你可以根据节点名称或者是 HTML 元素的 id 来获取对应的元素或者元素列表。
与 htmlparser 项目不同的是,jsoup 并没有为 HTML 元素定义一个对应的类,一般一个 HTML 元素的组成部分包括:节点名、属性和文本,jsoup 提供简单的方法供你自己检索这些数据。
通过类似于css或jQuery的选择器来查找元素
使用的是Element类的下记方法:
public Elements select(String cssQuery)
通过传入一个类似于CSS或jQuery的选择器字符串,来查找指定元素。
public void test4() throws IOException {
File input = new File("e:/test.html");
Document doc = Jsoup.parse(input,"UTF-8");
Elements links = doc.select("a[href]"); // 找出具有 href 属性的链接
Elements pngs = doc.select("img[src$=.png]");// 找出所有png 图片的元素
Element masthead = doc.select("div.headline").first();// 找出定义了 class="headline" 的元素
Elements resultLinks = doc.select("h3.simple-item__title > a"); // 找出了h3标签下的a标签
System.out.println(links);
}