Jsoup如何获取解析html元素内容?
微信朋友圈分享链接通常需要抓取html标签获取当前html页面的内容和第一张图片,如何抓取html元素呢,Java中通常用Jsoup组件去抓取元素,Jsoup 是一款Java的HTML解析包,主要用于对html进行解析,有时候我们需要从网页源码中提取有效的信息内容,比如网页的title,网页的body,使用jsoup对html网页进行解析,可以非常轻松的实现此类需求。
Jsoup可以解析一个html字符串,可以解析一个url,也可以解析一个html文本:
1:解析一个字符串
public static void parseHtmlText(){
String html = "<!DOCTYPE html><html><head><meta "
+ "charset=\"utf-8\"><title>demo</title>"
+ "</head><body><h1>你好,吃饭了吗</h1></body></html>";
Document document = Jsoup.parse(html);
System.out.println("title:" + document.title());
}
说明:
parse(String html, String baseUri)
这方法能够将输入的HTML解析为一个新的文档 (Document),参数 baseUri 是用来将相对 URL 转成绝对URL,并指定从哪个网站获取文档。如这个方法不适用,你可以使用parse(String html)
方法来解析成HTML字符串如上面的示例。.只要解析的不是空字符串,就能返回一个结构合理的文档,其中包含(至少) 一个head和一个body元素。
一旦拥有了一个Document,你就可以使用Document中适当的方法或它父类
Element
和Node
中的方法来取得相关数据。
2:解析一个body片段
public static void parseHtmlBody(){
String html = "<h1>Lorem ipsum</h1>";
Document doc = Jsoup.parseBodyFragment(html);
Element body = doc.body();
System.out.print("body:" + body.html());
}
3:解析一个html文本
public static void parseHtmlFile(){
try {
//根据当前class绝对路径得到当前的文件流
String file = JsoupMain.class.getResource("").getPath() + "index.html";
System.out.println("file:" + file);
Document document = Jsoup.parse(new File(file), "UTF-8","");
System.out.println("title:" + document.title());
} catch (IOException e) {
e.printStackTrace();
}
}
4:根据url解析html
public static void parseHtmlUrl(){
String url = "http://www.baidu.com/";
try {
Document document = Jsoup.connect(url).get();
String title = document.title();
System.out.println(title);
} catch (IOException e) {
e.printStackTrace();
}
}
注意:根据url解析html.并且获取标题(注意此写法在Android中应该将这个方法放在子线程中),
connect(String url) 方法创建一个新的 Connection, 和 get()
取得和解析一个HTML文件。如果从该URL获取HTML时发生错误,便会抛出 IOException,应适当处理。
5:获取html文档中的img标签
public static void parseHtmlImgElement(){
String url = "https://www.qq.com/";
try {
Document document = Jsoup.connect(url).get();
//获取html body元素
Element element = document.body();
Elements elements = element.getElementsByTag("img");
for(Element e : elements){
System.out.print("网页中图片地址:" + "http:" + e.attr("src"));
System.out.print(";宽:" + e.attr("width"));
System.out.println(";高:" + e.attr("height"));
}
} catch (IOException e) {
e.printStackTrace();
}
}
注意:e.attr("src")返回的字符串不是一个全路径,是//www.baidu.com/img/gs.gif
打印结果如下:
网页中图片地址:http://mat1.gtimg.com/pingjs/ext2020/qqindex2018/dist/img/qq_logo_2x.png;宽:100%;高:
网页中图片地址:http://mat1.gtimg.com/pingjs/ext2020/test2017/netwatch.png;宽:;高:
网页中图片地址:http://img1.gtimg.com/ninja/2/2018/10/ninja153907290259802.png;宽:;高:
网页中图片地址:http://img1.gtimg.com/ninja/2/2018/10/ninja153907291410277.png;宽:;高:
网页中图片地址:http://inews.gtimg.com/newsapp_ls/0/7969043087_640330/0;宽:;高:
网页中图片地址:http://img1.gtimg.com/ninja/2/2019/03/ninja155169290388291.jpg;宽:;高:
网页中图片地址:http://inews.gtimg.com/newsapp_ls/0/7967777098_150120/0;宽:;高:
网页中图片地址:http://img1.gtimg.com/bj/pics/hv1/64/147/2305/149920174.jpg;宽:;高:
网页中图片地址:http://mat1.gtimg.com/news/zt2018/qqpclmlogo/logo_ssy.png;宽:;高:
网页中图片地址:http://img1.gtimg.com/ninja/2/2019/03/ninja155165943065253.jpg;宽:;高:
网页中图片地址:http://inews.gtimg.com/newsapp_ls/0/7967571215_640330/0;宽:;高:
6:获取html文档中的<a>标签,并且将其链接打印出来
public static void parseHtmlLinkElement(){
String url = "https://www.baidu.com/";
try {
Document document = Jsoup.connect(url).get();
//获取html body元素
Element element = document.body();
Elements elements = element.getElementsByTag("a");
for(Element e : elements){
String linkHref = e.attr("href");
String linkText = e.text();
System.out.println("linkHref:" + linkHref);
System.out.println("linkText:" + linkText);
}
} catch (IOException e) {
e.printStackTrace();
}
}
7:选择器语法查找元素以及属性
public static void selectHtmlLinkElement(){
String url = "https://www.baidu.com/";
try {
Document document = Jsoup.connect(url).get();
//获取标签a带有href属性的元素
Elements links = document.select("a[href]");
//找到img标签中以png结尾的标签
Elements pngs = document.select("img[src$=.png]");
//获取class等于s-top-wrap的div标签,获取他的第一个元素
Element divElement = document.select("s-isindex-wrap").first();
if(divElement != null){
System.out.println(divElement.data());
}
for(Element e : links){
System.out.println(e.attr("href"));
}
System.out.println("**************selectHtmlLinkElement***************");
for(Element e : pngs){
System.out.println("http:" + e.attr("src"));
}
} catch (IOException e) {
e.printStackTrace();
}
}
Selector选择器的使用:
tagname: 通过标签查找元素,比如:a
ns|tag: 通过标签在命名空间查找元素,比如:可以用 fb|name 语法来查找 <fb:name> 元素
#id: 通过ID查找元素,比如:#logo
.class: 通过class名称查找元素,比如:.masthead
[attribute]: 利用属性查找元素,比如:[href]
[^attr]: 利用属性名前缀来查找元素,比如:可以用[^data-] 来查找带有HTML5 Dataset属性的元素
[attr=value]: 利用属性值来查找元素,比如:[width=500]
[attr^=value], [attr$=value], [attr*=value]: 利用匹配属性值开头、结尾或包含属性值来查找元素,比如:[href*=/path/]
[attr~=regex]: 利用属性值匹配正则表达式来查找元素,比如: img[src~=(?i)\.(png|jpe?g)]
参考链接:https://www.open-open.com/jsoup/parse-document-from-string.htm