小组分享内容二:Jsoup部分(未完待续)

目录

1.Jsoup是什么:

2.Jsoup的作用

3.通过Jsoup获取文档对象

        1.使用Jsoup进行URL的解析

        2.使用Jsoup可以进行html标签代码的解析

        3.使用Jsoup可以进行html文件的解析

        4.较完整代码

4.为了要操作页面的元素,可以使用Document对象的方法获取到页面某些标签

        1.getElementsByTag()方法可以根据标签名字来获取某个标签元素

        2.getElementById()方法可以根据标签ID来获取某个标签元素

        3.getElementsByClass()方法可以根据标签的类名来获取某个标签元素

        4.getElementsByAttribute()方法可以根据标签的属性来获取某个标签元素

5.如何通过一个统一的方法获取元素(对标第四个内容)

        示例代码:

6.如何通过元素获取该元素的数据

        1.获取元素id

        2.获取元素className

                1.Element对象.className()

                2.Element对象.classNames()

        3.获取元素的属性值attr

        4.获取元素文本text

        5.获取元素属性值attributes

        6.略微完整代码 


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.如何通过一个统一的方法获取元素(对标第四个内容)

        由于刚才第四个的内容里通过不同方式获取元素用了多种方法太费劲,所以jsoup还有一个select方法可以省去记忆那么多方法,但是select方法虽然不用像刚才那样记方法名了,可依然要记一些类似CSS的规则

        select方法的形参为一个字符串,通过字符串的格式的不同来区分你的查询方式,

                单纯的标签查询不需要花里胡哨的东西,

                如果通过id查询就在id值前加个“#",

                如果通过class查询就在class值前加个".",

                如果通过属性名查询就在属性名前后加"[]",

                如果通过属性名与他的值的组合查询就在该组合的外面加"[]"

Elements byTag = document.select("div");//这句的意思是查找div元素
Elements byId = document.select("#cms_play");//这句的意思是查找id为cms_play的元素
Elements byClass = document.select(".embed-responsive");//这句是根据类名找到的
Elements byAttributeName = document.select("[class]");//意思是查找所有的拥有class属性的元素
Elements byAttr = document.select("[class=embed-responsive embed-responsive-16by9]");//意思是查找所有具有class且其值为embed-responsive embed-responsive-16by9的元素

        示例代码:

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) {
        JsoupSelectGetElement("https://www.loyo.cc/xianggangju/wohejiangshiyougeyuehuiguoyudiyibu/2-24.html");
    }
    public static void JsoupSelectGetElement(String url){
        try {
            Document document = Jsoup.parse(new URL(url),5000);
            //通过选择器来进行元素的获取有一个公共特征就是会返回回来的都是Elements,因为这个方法不能跟几乎参数来决定返回值
                //该选择方法的形参为一个字符串,通过字符串的格式的不同来区分你的查询方式,单纯的标签查询不需要花里胡哨的东西,如果通过id查询就在id值前加个“#",如果通过class查询就在class值前加个".",通过属性名查询就在属性名前后加"[]",通过属性名与他的值的组合查询就在该组合的外面加"[]"
            Elements byTag = document.select("div");//这句的意思是查找div元素
            Elements byId = document.select("#cms_play");//这句的意思是查找id为cms_play的元素
            Elements byClass = document.select(".embed-responsive");//这句是根据类名找到的
            Elements byAttributeName = document.select("[class]");//意思是查找所有的拥有class属性的元素
            Elements byAttr = document.select("[class=embed-responsive embed-responsive-16by9]");//意思是查找所有具有class且其值为embed-responsive embed-responsive-16by9的元素
                    //刚才使用的都是select方法,如果使用selectFirst方法就是获取刚才获取到的Elements中的第一个元素
            for(Element o:byTag){
                System.out.println("div元素的内容"+o.text());
            }
            System.out.println("\n\n\n");
            for(Element o:byId){
                System.out.println("id为cms_play的元素:"+o.toString());
            }
            System.out.println("\n\n\n");
            for(Element o:byClass){
                System.out.println("class为embed-responsive的元素:"+o.toString());
            }
            System.out.println("\n\n\n");
            for(Element o:byAttr){
                System.out.println("根据属性与其值组合的元素的查找结果:"+o.toString());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

6.如何通过元素获取该元素的数据

        当我获取到某个元素之后光获取到元素还不够,我要做的既然是解析这个页面,就一定要拿到他的数据,比如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();
        }
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值