目录
4.为了要操作页面的元素,可以使用Document对象的方法获取到页面某些标签
1.getElementsByTag()方法可以根据标签名字来获取某个标签元素
2.getElementById()方法可以根据标签ID来获取某个标签元素
3.getElementsByClass()方法可以根据标签的类名来获取某个标签元素
4.getElementsByAttribute()方法可以根据标签的属性来获取某个标签元素
1.Jsoup是什么:
是HTML的解析器,可以解析URL地址,HTML的文本内容,可以使用DOM,CSS以及类似Jquery的操作方法来操作数据
2.Jsoup的作用
1.通过URL或者文件或者字符串获取到HTML页面并解析
2.使用DOM或CSS等操作来对数据进行操作
3.可以操作HTML元素
3.通过Jsoup获取文档对象
每一个HTML都是一个文档对象(document对象),里面包含很多元素或者元素集合(Element或者Elements)
1.使用Jsoup进行URL的解析
既然要通过URL进行HTML的获取,那第一步肯定是先通过URL获取到网页内容了,使用parse方法
Document document = Jsoup.parse(new URL("https://www.loyo.cc/xianggangju/wohejiangshiyougeyuehuiguoyudiyibu/2-24.html"),5000);
2.使用Jsoup可以进行html标签代码的解析
也是用parse方法,参数是String类型的html代码,这里使用的是一个文件里面的HTML标签代码
我需要先把文件里面的字符串提取出来,采用FileUtils类的readFileToString方法,参数是文件和编码方式
String content = FileUtils.readFileToString(new File(urlAddress),"utf-8");
Document document = Jsoup.parse(content);
3.使用Jsoup可以进行html文件的解析
还是使用parse方法,第一个参数是文件,第二个参数是编码方式
Document document = Jsoup.parse(new File(urlAddress),"utf-8");
4.较完整代码
package org.example.jsoup;
import org.apache.commons.io.FileUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.File;
import java.io.IOException;
import java.net.URL;
public class JsoupAnalysis {
public static void main(String[] args) {
//"https://www.loyo.cc/xianggangju/wohejiangshiyougeyuehuiguoyudiyibu/2-24.html"
// "E:\\资料\\CodeSpace\\firstWeb\\src\\main\\webappp"
JsoupStringAnalysis("E:\\1.html");
JsoupURLAnalysis("https://www.loyo.cc/xianggangju/wohejiangshiyougeyuehuiguoyudiyibu/2-24.html");
JsoupFileAnalysis("E:\\1.html");
}
public static void JsoupURLAnalysis(String urlAddress){
try {
Document document = Jsoup.parse(new URL(urlAddress),5000);
String titleText = document.getElementsByTag("title").first().text();
System.out.println(titleText);
} catch (IOException e) {
e.printStackTrace();
}
}
public static void JsoupFileAnalysis(String urlAddress){
try {
Document document = Jsoup.parse(new File(urlAddress),"utf-8");
String titleText = document.getElementsByTag("title").first().text();
System.out.println(titleText);
} catch (IOException e) {
e.printStackTrace();
}
}
public static void JsoupStringAnalysis(String urlAddress){
try {
//加入有一个html文件,你又不想采用直接用文件的方式解析他的html页面,那么你就可以把文件里的超文本标记语言代码转化成字符串传递给Jsoup的parse方法让他根据这个字符串来创建documen对象
String content = FileUtils.readFileToString(new File(urlAddress),"utf-8");
Document document = Jsoup.parse(content);
String titleText = document.getElementsByTag("title").first().text();
System.out.println(titleText);
} catch (IOException e) {
e.printStackTrace();
}
}
}
4.为了要操作页面的元素,可以使用Document对象的方法获取到页面某些标签
下面介绍了四种获取Element对象的方式,只有ID的获取方式每次只可以获取到一个元素,剩下的都是可以获取到多个元素,因为每个id只对应一个元素,而其他的东西可以对应多个元素,
在获取到多个元素之后可以使用.first等方法来选择到底要用获取到的多个元素中的哪个元素
1.getElementsByTag()方法可以根据标签名字来获取某个标签元素
这里使用getElementByTag()获取title标签之后选中获取到的这一堆标签里面的第一个标签(.first)然后输出他标签内部的文本内容(.text)
String titleText = document.getElementsByTag("title").first().text();
2.getElementById()方法可以根据标签ID来获取某个标签元素
Element AIdText = document.getElementById("btn");
3.getElementsByClass()方法可以根据标签的类名来获取某个标签元素
假如一个元素他的class="s_name s_id"说明的是其实这个元素属于两个类,那么我在通过类名获取的时候既可以用s_name作为他的类名,也可以用s_id作为他的类名,还可以用s_name s_id作为他的类名,也就是说下面这三种获取Elements的方法获取到的一堆Element对象里都含有我需要的这个元素
Elements AClassText1 = document.getElementsByClass("s_name");
Elements AClassText2 = document.getElementsByClass("s_id");
Elements AClassText3 = document.getElementsByClass("s_name s_id");
4.getElementsByAttribute()方法可以根据标签的属性来获取某个标签元素
Elements AAttributeText = document.getElementsByAttribute("abc");
5.如何通过元素获取该元素的数据
当我获取到某个元素之后光获取到元素还不够,我要做的既然是解析这个页面,就一定要拿到他的数据,比如id,className,attributes(所有的属性),attr(属性的值),text(文本内容)等数据
1.获取元素id
获取id,使用Element对象的id()方法
String divIdValue = div.id();
System.out.println("这个元素的id值为:\t"+divIdValue+"\n\n\n");
2.获取元素className
这个有两种方法,分别但是他们的返回值不同,一个不管有多少个类名,都返回一个拼接好的字符串,每个类名之间用空格隔开,另一个把每一个类名作为一个元素存放在Set集合中
1.Element对象.className()
//如果用Element对象.className()那么会显示出来他这两个名字
String divClassValue = div.className();
System.out.println("这个元素所有的类名拼接在一起中间用空格间隔开为:"+divClassValue);
2.Element对象.classNames()
//如果用Element对象.classNames()那么他的返回值是一个Set集合,会把这两个名字分别存在集合里作为元素
Set<String> divClassValues = div.classNames();
int index = 1;
for(String o:divClassValues){
System.out.println("这个元素的第"+index+"个类名是:"+o);
index++;
}
3.获取元素的属性值attr
获取指定属性的属性值,使用attr(属性名)方法
String wantAttribute = "class";
String divAttrValue = div.attr(wantAttribute);//这里的目的是获取属性名为class的属性的值
System.out.println("\n\n\n"+wantAttribute+"的属性值是:"+divAttrValue+"\n\n\n");
4.获取元素文本text
String text = div.text();
5.获取元素属性值attributes
获取所有的属性,使用attribute方法
Attributes attributes = div.attributes();
for(Attribute o:attributes){
System.out.println("这个元素的第"+index+"个属性名是:"+o.getKey()+"\t值是:"+o.getValue());
}
6.略微完整代码
package org.example.jsoup;
import org.apache.commons.io.FileUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Attribute;
import org.jsoup.nodes.Attributes;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.Set;
public class JsoupAnalysis {
public static void main(String[] args) {
JsoupGetMessageOfElements("https://www.loyo.cc/xianggangju/wohejiangshiyougeyuehuiguoyudiyibu/2-24.html");
}
public static void JsoupGetMessageOfElements(String urlAddress){
try {
Document document = Jsoup.parse(new URL(urlAddress),5000);
String documentString = document.toString();
// System.out.println(documentString);
Elements divs=document.getElementsByClass("embed-responsive embed-responsive-16by9");
Element div = divs.first();
//获取id,使用Element对象的id()方法
String divIdValue = div.id();
System.out.println("这个元素的id值为:\t"+divIdValue+"\n\n\n");
//获取classname,像是我获取的这个元素,很明显他的class有两个,那么我在获取className的时候
//如果用Element对象.className()那么会显示出来他这两个名字
String divClassValue = div.className();
System.out.println("这个元素所有的类名拼接在一起中间用空格间隔开为:\t\t\t\t\t\t"+divClassValue);
//如果用Element对象.classNames()那么他的返回值是一个Set集合,会把这两个名字分别存在集合里作为元素
Set<String> divClassValues = div.classNames();
int index = 1;
for(String o:divClassValues){
System.out.println("这个元素的第"+index+"个类名是:\t\t\t\t\t\t\t\t\t\t\t"+o);
index++;
}
index = 0;
//获取指定属性的属性值,使用attr(属性名)方法
String wantAttribute = "class";
String divAttrValue = div.attr(wantAttribute);//这里的目的是获取属性名为class的属性的值
System.out.println("\n\n\n"+wantAttribute+"的属性值是:"+divAttrValue+"\n\n\n");
//获取所有的属性,使用attribute方法
Attributes attributes = div.attributes();
for(Attribute o:attributes){
System.out.println("这个元素的第"+index+"个属性名是:"+o.getKey()+"\t值是:"+o.getValue());
}
String text = div.text();
} catch (IOException e) {
e.printStackTrace();
}
}
}