jsoup是一个用于解析、提取、操作HTML的开源Java函式库。

1、简介

Jsoup的主要功能有三部分组成:

  1. 从字符串,网页,本地文件等方式生成Documentn
  2. 在生成Doucment后,根据Dom和css或类似jquery的selector语法获取Element,然后再从Elements中获取节点属性、文本、html
  3. 对Element的进行操作,包括HTML的值、节点内容的值和设置节点属性的值

POM.xml 配置

  1. <dependency>
  2. <groupId>org.jsoup</groupId>
  3. <artifactId>jsoup</artifactId>
  4. <version>1.10.2</version>
  5. </dependency>

2. 生成Document

2.1 从字符串生成Document

关键方法:Jsoup.parse 代码

  1. public static void main(String[] args) throws Exception {
  2. //1.实用工具类获取文件的字符串
  3. String content = FileUtils.readFileToString(new File("f:\\......"), "utf8");
  4. //2.解析
  5. Document doc = Jsoup.parse(content);
  6. String title = doc.getElementsByTag("title").first().text();
  7. System.out.println(title);
  8. }

2.2 从URL生成Document

  1. public static void main(String[] args) throws Exception {
  2. //1.解析Url地址,第二个参数是访问超时时间
  3. Document doc = Jsoup.parse(new URL("http://www.itcast.cn"), 1000);
  4. //2.使用标签选择器,获取title
  5. String title = doc.getElementsByTag("title").first().text();
  6. System.out.println(title);
  7. }

PS:虽然jsoup可以直接的发出请求,但是我们一般不使用jsoup进行URL请求。

2.3 从文件解析

  1. public static void main (String[] args) throws Exception {
  2. Document doc = Jsoup.parse(new File(""), "utf8");
  3. String title = doc.getElementsByTag("title").first().text();
  4. System.out.println(title);
  5. }

3. 获取Element及节点属性、文本、html

下面就可以对这个document进行操作,操作的主要单位是Element,下面介绍如何选取elment及获取elment的内容。
本地包含的主要内容获取节点信息:

  1. 获取Element,获取的方式有二种: a DOM; b 通过css或类似jquery的selector语法
    2. 获取节点属性、文本、html

3.1 使用DOM的方式遍历文档

A:查看元素 :::info getElementById(String id)
getElementsByTag(String tag)
getElementsByClass(String className)
getElementsByAttribute(String key) (and related methods)
Element siblings: siblingElements(), firstElementSibling(), lastElementSibling(); nextElementSibling(), previousElementSibling()
Graph: parent(), children(), child(int index) ::: B:元素数据

  1. 1、从元素中获取id
  2. 2、从元素中获取className classNames 会根据空格进行拆分
  3. 3、从元素中获取属性的值attr
  4. 4、从元素中获取所有的属性 attributes
  5. 5、从元素中获取文本
  6. text()获取文本内容 text(String value) 设置文本内容
  7. html()获取元素内HTML html(String value)设置元素内的HTML内容
  8. outerHtml()获取元素外HTML内容
  9. data()获取数据内容(例如:scriptstyle标签)
  1. @Test
  2. public void testDOM() throws Exception{
  3. //1.解析文件,获取Document对象
  4. Document doc = Jsoup.parse(new File(""), "utf8");
  5. Element element = doc.getElementById("id1");
  6. Element element1 = doc.getElementsByTag("span").first();
  7. Element element2 = doc.getElementsByClass("class_a").first();
  8. Element element3 = doc.getElementsByAttribute("abc")
  9. # 根据属性名称和属性的值获取
  10. Element element4 = doc.getElementsByAttributeValue("href","http://www,baidu.com")
  11. System.out.println("根据ID获取元素内容是:"+element.text());
  12. System.out.println("根据span获取元素内容是:"+element1.text());
  13. System.out.println("根据class获取元素内容是:"+element2.text());
  14. }

获取元素中的值:

  1. public void testData() throws Exception{
  2. //1.解析文件,获取Document对象
  3. Document doc = Jsoup.parse(new File(""), "utf8");
  4. Element element = doc.getElementById("id1");
  5. String str = "";
  6. str = element.id();
  7. str = element.className();
  8. str = element.data();
  9. # 根据属性名称获取属性的值
  10. str = element.attr("id");
  11. str = element.attr("class");
  12. # 获取文本
  13. str = element.text();
  14. System.out.println();
  15. }

3.2 使用选择器的方式获取元素

  • jsoup elements对象支持类似于CSS (或jquery)的选择器语法,来实现非常强大和灵活的查找功能。.
  • 这个select 方法在Document, Element,或Elements对象中都可以使用。且是上下文相关的,因此可实现指定元素的过滤,或者链式选择访问。
  • Select方法将返回一个Elements集合,并提供一组方法来抽取和处理结果。

A:Selector选择器概述:  

  1. tagname: 通过标签查找元素,比如:a
  2. ns|tag: 通过标签在命名空间查找元素,比如:可以用 fb|name 语法来查找 元素
  3. id: 通过ID查找元素,比如:#logo

  4. .class: 通过class名称查找元素,比如:.masthead
  5.  [attribute]: 利用属性查找元素,比如:[href]
  6.  [^attr]: 利用属性名前缀来查找元素,比如:可以用[^data-] 来查找带有HTML5 Dataset属性的元素
  7.  [attr=value]: 利用属性值来查找元素,比如:[width=500]
  8.  [attr^=value], [attr$=value], [attr=value]: 利用匹配属性值开头、结尾或包含属性值来查找元素,比如:[href=/path/]
  9.  [attr~=regex]: 利用属性值匹配正则表达式来查找元素,比如: img[src~=(?i).(png|jpe?g)]
  10.  *: 这个符号将匹配所有元素

B:Selector选择器组合使用

  1.  el#id: 元素+ID,比如: div#logo
  2.  el.class: 元素+class,比如: div.masthead
  3.  el[attr]: 元素+class,比如: a[href]
  4.  任意组合,比如:a[href].highlight
  5.  ancestor child: 查找某个元素下子元素,比如:可以用.body p 查找在”body”元素下的所有 p元素
  6.  parent > child: 查找某个父元素下的直接子元素,比如:可以用div.content > p 查找 p 元素,也可以用body > * 查找body标签下所有直接子元素
  7.  siblingA + siblingB: 查找在A元素之前第一个同级元素B,比如:div.head + div
  8.  siblingA ~ siblingX: 查找A元素之前的同级X元素,比如:h1 ~ p
  9.  el, el, el:多个选择器组合,查找匹配任一选择器的唯一元素,例如:div.masthead, div.logo

    
C:伪选择器selectors

  1.  :lt(n): 查找哪些元素的同级索引值(它的位置在DOM树中是相对于它的父节点)小于n,比如:td:lt(3) 表示小于三列的元素
  2.  :gt(n):查找哪些元素的同级索引值大于n,比如: div p:gt(2)表示哪些div中有包含2个以上的p元素
  3.  :eq(n): 查找哪些元素的同级索引值与n相等,比如:form input:eq(1)表示包含一个input标签的Form元素
  4.  :has(seletor): 查找匹配选择器包含元素的元素,比如:div:has(p)表示哪些div包含了p元素
  5.  :not(selector): 查找与选择器不匹配的元素,比如: div:not(.logo) 表示不包含 class=”logo” 元素的所有 div 列表
  6.  :contains(text): 查找包含给定文本的元素,搜索不区分大不写,比如: p:contains(jsoup)
  7.  :containsOwn(text): 查找直接包含给定文本的元素
  8.  :matches(regex): 查找哪些元素的文本匹配指定的正则表达式,比如:div:matches((?i)login)
  9. :matchesOwn(regex): 查找自身包含文本匹配指定正则表达式的元素

注意:上述伪选择器索引是从0开始的,也就是

简单选择器:

  1. public static void main(String[] args) throws Exception {
  2. //1.解析文件,获取Document对象
  3. Document doc = Jsoup.parse(new File(""), "utf8");
  4. Elements elements = doc.select("span");
  5. for (Element element : elements) {
  6. System.out.println(element.text());
  7. }
  8. Element element1 = doc.select("#city_id").first();
  9. System.out.println(element1.text());
  10. Element el = doc.select(".class_a").first();
  11. }

组合使用:

  1. public static void main(String[] args) throws Exception {
  2. Document doc = Jsoup.parse(new File(""), "utf8");
  3. Element element = doc.select("h3#city_b").first();
  4. Element element2 = doc.select("li.class_a").first();
  5. // span中有abc属性的
  6. Element element3 = doc.select("span[abc]").first();
  7. // span标签包含abc属性 span[abc] 然后找到class有s_name的 span[abc].s_name
  8. Element element4 = doc.select("span[abc].s_name").first();
  9. System.out.println(element.text());
  10. }