Jsoup简介
jsoup是一款Java的HTML解析器,主要用来对HTML解析。
中文文档:https://www.open-open.com/jsoup
能用Jsoup实现什么?
- 从URL,文件或字符串中刮取并解析HTML
- 查找和提取数据,使用DOM遍历或CSS选择器
- 操纵HTML元素,属性和文本
- 根据安全的白名单清理用户提交的内容,以防止XSS攻击
- 输出整洁的HTML
在爬虫的时候,当我们用HttpClient之类的框架,获取到网页源码之后,需要从网页源码中取出我们想要的内容,就可以使用jsoup这类HTML解析器了。可以非常轻松的实现。
虽然jsoup也支持从某个地址直接去爬取网页源码,但是只支持HTTP,HTTPS协议,支持不够丰富。所以,主要还是用来对HTML进行解析。
依赖:
<!-- https://mvnrepository.com/artifact/org.jsoup/jsoup -->
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.11.3</version>
</dependency>
Jsoup重要类
1、org.jsoup.Jsoup类
Jsoup类是任何Jsoup程序的入口点,并将提供从各种来源加载和解析HTML文档的方法。
方法 | 描述 |
---|---|
static Connection connect(String url) | 创建并返回URL的连接。 |
static Document parse(File in, String charsetName) | 将指定的字符集文件解析成文档。 |
static Document parse(String html) | 将给定的html代码解析成文档。 |
tatic String clean(String bodyHtml, Whitelist whitelist) | 从输入HTML返回安全的HTML,通过解析输入HTML 并通过允许的标签和属性的白名单进行过滤。 |
2、org.jsoup.nodes.Document类
3、org.jsoup.nodes.Element类
方法 | 描述 |
---|---|
child(int index) | 通过索引 定位到子元素. |
children() | 获取这个元素的所有子孩子 |
className() | 获取这个元素的class属性的名字 |
classNames() | 获取所有元素的class名字 返回值: Set< String> |
classNames(Set< String> classNames ) | 通过提供的class名字来设置元素的class属性 |
data() | 获取这个元素的结合数据 |
empty() | 移除这个元素的所有孩子数据节点. |
firstElementSibling() | 获取当前元素 同一级别的第一个兄弟元素. |
getAllElements() | 拿到当前元素下的所有元素 ( 包括 自己 , 孩子 , 孩子的孩子) |
getElementsByAttribute(String key) | 通过属性名称 查找当前html下的所有元素 |
getElementsByClass(String className) | 当前元素是否有此class 或者在这个元素下面是否有这个class |
html() | 检索文件内的Html |
id() | 返回当前元素的id值 |
isBlock() | 测试这个元素是不是层级元素 |
lastElementSibling() | 获取这个元素的同一级别元素的最后一个 |
parent() | 获取这个节点的父节点 |
parents() | 获取到父节点 ,一直到节点的根节点 |
select() | 选择器方法 , 万能的 |
siblingElements() | 获取所有的兄弟元素(不包含自己) |
tag() | 获取这个标签对象 |
tagName() | 获取这个标签的名字 |
text() | 获取这个元素和所有孩子的文本内容 |
textNodes() | 获取这个元素的孩子文本标签集合 |
wrap() | 包装这个元素的html |
实例:
- 从URL加载文档,使用Jsoup.connect()方法从URL加载HTML。
Document document = Jsoup.connect("https://blog.csdn.net/weixin_43611712/article/details/100030552").get();
System.out.println(document.title());
- 要获取网页中的所有链接
Document document = Jsoup.connect("https://blog.csdn.net/weixin_43611712");
Elements links = document.select("a[href]");
for (Element link : links) {
System.out.println("link : " + link.attr("href"));
System.out.println("text : " + link.text());
}
- 要获取网页中显示的所有图像
Document document = Jsoup.connect("https://blog.csdn.net/weixin_43611712/article/details/100030552");
Elements images = document.select("img[src~=(?i)\\.(png|jpe?g|gif)]");
for (Element image : images) {
System.out.println("src : " + image.attr("src"));
System.out.println("height : " + image.attr("height"));
System.out.println("width : " + image.attr("width"));
System.out.println("alt : " + image.attr("alt"));
}
- 获取URL的元信息。元信息包括Google等搜索引擎用来确定网页内容的索引为目的。 它们以HTML页面的HEAD部分中的一些标签的形式存在。
Document document = Jsoup.connect("https://blog.csdn.net/weixin_43611712/article/details/100030552");
String description = document.select("meta[name=description]").get(0).attr("content");
System.out.println("Meta description : " + description);
String keywords = document.select("meta[name=keywords]").first().attr("content");
System.out.println("Meta keyword : " + keywords);