文章目录
Jsoup简介
Jsoup是一款Java的HTML解析器,可以直接解析某个URL地址,HTML文本内容.它提供了一套非常省力的API,通过可以DOM,CSS以及类似于jQuery的操作方法取出和操作数据.
依赖
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.10.2</version>
</dependency>
<!--操作文件的工具类-->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
<!--字符串处理工具-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.7</version>
</dependency>
<!--测试用例-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
解析URL
根据url下载数据,然后对下载的数据进行解析
@Test
public void testUrl() throws Exception {
// 解析url
// 第一个参数为访问的url,第二个参数为访问的超时时间
Document doc = Jsoup.parse(new URL("http://www.baidu.com"), 1000);
//使用标签选择器获取title中的内容
String title = doc.getElementsByTag("title").first().text();
System.out.println(title);
}
解析字符串
@Test
public void testString() throws Exception {
//使用工具类读取文件,获取字符串
String content = FileUtils.readFileToString(new File("C:\\Users\\yubin14\\Desktop\\new.html"), "utf8");
//使用Jsoup解析字符串
Document doc = Jsoup.parse(content);
String title = doc.getElementsByTag("title").first().text();
System.out.println(title);
}
解析文件
@Test
public void testFile() throws Exception {
//解析文件
Document doc = Jsoup.parse(new File("C:\\Users\\yubin14\\Desktop\\new.html"), "utf8");
String title = doc.getElementsByTag("title").first().text();
System.out.println(title);
}
使用Dom获取元素
1. 根据id获取元素
//1. 根据id获取元素
Element element = doc.getElementById("people");
//打印标签中的文本
System.out.println(element.text());
2. 根据标签获取元素
//2. 根据标签获取元素
Element element = doc.getElementsByTag("span").first();
System.out.println(element.text());
3. 根据class获取元素
//3. 根据class获取元素
Element element = doc.getElementsByClass("lione").first();
System.out.println(element.text());
4. 根据属性获取元素
//4. 根据属性获取元素
Element element1 = doc.getElementsByAttribute("abc").first();
//根据属性名和属性值获取元素
Element element2 = doc.getElementsByAttributeValue("abc", "123").first();
System.out.println(element1.text());
从元素中获取数据
@Test
public void testData() throws Exception {
Document doc = Jsoup.parse(new File("C:\\Users\\yubin14\\Desktop\\new.html"), "utf8");
Element element = doc.getElementsByTag("img").first();
String str = "";
//从元素中获取id
str = element.id();
//从元素中获取className
str = element.className(); //多个类名时不拆分
Set<String> classNames = element.classNames();//多个类名时拆分
//从元素中根据属性名获取属性值
str = element.attr("src");
//从元素中获取所有属性
Attributes attributes = element.attributes();
System.out.println(attributes);
//从元素中获取文本内容
str = element.text();
System.out.println(str);
}
使用选择器获取元素
@Test
public void testSelector() throws Exception {
Document doc = Jsoup.parse(new File("C:\\Users\\yubin14\\Desktop\\new.html"), "utf8");
//通过标签查找元素
Elements elements = doc.select("span");
// for (Element element : elements) {
// System.out.println(element.text());
// }
//通过id查找元素
Element element = doc.select("#people").first();
System.out.println(element.text());
//通过class获取元素
Element element1 = doc.select(".lione").first();
System.out.println(element1.text());
//通过属性获取元素
Element element2 = doc.select("[abc]").first();
System.out.println(element2.text());
//通过属性名和属性值查找元素
Elements elements1 = doc.select("[abc=123]");
for (Element element3 : elements1) {
System.out.println(element3.text());
}
}
选择器的组合使用
@Test
public void testSelector2() throws Exception {
Document doc = Jsoup.parse(new File("C:\\Users\\yubin14\\Desktop\\new.html"), "utf8");
//元素+id: el#id
Elements select = doc.select("div#a");
System.out.println(select.text());
//元素+class: el.class
Element element = doc.select("li.news-meta-item").first();
System.out.println(element.text());
//元素+属性名:el[attr]
Element first = doc.select("li[abc]").first();
System.out.println(first.text());
//查找某元素下面的子元素 parent child
Elements elements = doc.select(".s-rank-title div");
for (Element element1 : elements) {
System.out.println(element1.text());
}
//查找某元素的直接子元素 parent > child
Elements elements1 = doc.select("c > a");
for (Element element1 : elements1) {
System.out.println(element1.text());
}
//查找某元素的所有直接子元素 parent > *
Elements select1 = doc.select("parent > *");
for (Element element1 : select1) {
System.out.println(element1.text());
}
}
元素,id,class,属性名的组合是任意的,可以有两个,也可以有多个