作者:cndz 围观群众:633 更新于 标签:html格式化html解析java爬虫jsoup详解
Jsoup是一款Java HTML解析器,它可以从HTML文档中提取数据。它提供了一种简单的API,可以通过CSS选择器和类似于jQuery的语法来查找、提取和操作数据。Jsoup多用于java爬虫、html解析、html格式化等。在本文中,我们将深入了解Jsoup的一些基础用法和特性。
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.11.3</version>
</dependency>
官方说明里,一个重要的功能就是output tidy HTML,其中dity HTML的主要包括 换行、缩进、标签闭合。
我们看下代码实例,使用jsoup格式化功能,输入信息如下:
public static void main(String[] args) {
String html = "<!doctype html><html lang=\"en\"><head><meta charset=\"UTF-8\"><meta name=\"viewport\" content=\"width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0\"><meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\"><title>Document</title></head><body><p>这个标签没有闭合 <div>这个标签没有换行</div> <table><tr><td>标签错误没有tbody标签</td></tr></body></html>";
Document parse = Jsoup.parse(html);
System.out.println(parse.toString());
}
下面是运行结果
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<p>这个标签没有闭合 </p>
<div>
这个标签没有换行
</div>
<table>
<tbody>
<tr>
<td>标签错误没有table标签</td>
</tr>
</tbody>
</table>
</body>
</html>
我们可以看到格式化后的代码没有闭合的标签闭合了,没有换行的块标签换行了,而且格式化后的代码自动缩进了。
要使用Jsoup解析HTML文档,我们需要先获取该文档。Jsoup提供了两种方法来获取HTML文档,分别是从URL和从本地文件获取。
// 从URL获取HTML文档
Document doc = Jsoup.connect("http://www.baidu.com").get();
// 从本地文件获取HTML文档
File input = new File("example.html");
Document doc = Jsoup.parse(input, "UTF-8");
其中,Jsoup.connect()方法用于从URL获取HTML文档,Jsoup.parse()方法用于从本地文件获取HTML文档。
获取HTML文档后,我们就可以使用Jsoup提供的API来解析文档了。以下是一些常用的解析方法:
Jsoup提供了多种方法来获取元素,其中最常用的是使用CSS选择器。以下是一些示例:
// 获取所有<a>元素
Elements links = doc.select("a");
// 获取所有带有href属性的<a>元素
Elements links = doc.select("a[href]");
// 获取所有class为"header"的元素
Elements headers = doc.select(".header");
// 获取所有id为"logo"的元素
Element logo = doc.select("#logo").first();
要获取元素的属性值,可以使用Element.attr()方法。以下是一个示例:
// 获取第一个<a>元素的href属性值
String linkHref = links.first().attr("href");
要获取元素的文本,可以使用Element.text()方法。以下是一个示例:
// 获取第一个<a>元素的文本
String linkText = links.first().text();
代码实例:获取一个文本中所有不带有 rel=”nofollow”属性的a标签。
try {
document = Jsoup.connect("http://www.baidu.com").get();
} catch (IOException e) {
e.printStackTrace();
log.info("链接抓取失败");
}
//使用select获取所有的a标签
Elements links = Jsoup.parse(document.outerHtml()).select("a");
// 使用循环遍历每个标签数据
for (Iterator<Element> it = links.iterator(); it.hasNext(); ) {
Element e = (Element) it.next();
String qUrl = e.attr("href");
//如果rel属性是nofollow的话continue;
if (StringUtils.equals(e.attr("rel"), "nofollow")) {
continue;
}
//可以使用e.text()输入a标签的文本。
allUrls.add(qUrl);
}
return allUrls;
除了解析HTML文档外,Jsoup还提供了一些方法来处理HTML文本。以下是一些常用的方法:
要清除HTML文本中的所有标签,可以使用Jsoup.parse()方法,并使用text()方法获取文本。以下是一个示例:
// 清除HTML标签
String cleanText = Jsoup.parse(html).text();
要过滤HTML文本中的指定标签,可以使用Whitelist类。以下是一个示例:
// 过滤HTML标签
String safe = Jsoup.clean(unsafe, Whitelist.basic());
其中,unsafe为原始HTML文本,safe为过滤后的HTML文本。
代码实例:
public static void main(String[] args) throws IOException {
String html = "<!doctype html>\n" +
"<html lang=\"en\">\n" +
" <head>\n" +
" <meta charset=\"UTF-8\">\n" +
" <meta name=\"viewport\" content=\"width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0\">\n" +
" <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n" +
" <title>Document</title>\n" +
" </head>\n" +
" <body>\n" +
" <p>测试段落 </p>\n" +
" <div>测试div</div>\n" +
" <b>张三</b>\n" +
" </table>\n" +
" </body>\n" +
"</html>";
Whitelist whitelist = new Whitelist();
whitelist.addTags("div");
String clean = Jsoup.clean(html, whitelist);
System.out.println(clean);
}
其实爬虫说白了就是组合上边的那些方法。按照某种规律来抓取往上的信息。这里就不过多赘述了。
Java Jsoup是一款功能强大的HTML解析器,它可以帮助我们轻松地从HTML文档中提取数据。在本文中,我们介绍了一些基础用法和特性,希望可以帮助读者更好地使用Jsoup。