Jsoup和JsoupXpath的实际使用案例

本文详细介绍了如何使用Jsoup和JsoupXpath库来解析HTML文档,包括连接网页、提取元素、操作属性以及XPath选择器的运用。示例代码展示了从百度百科Java条目中提取图片、摘要、关键词等信息,强调了Jsoup和JsoupXpath在网页抓取和解析中的实用功能。
摘要由CSDN通过智能技术生成

依赖引入

// JsoupXpath会自动引入jsoup依赖
<dependency>
    <groupId>cn.wanghaomiao</groupId>
    <artifactId>JsoupXpath</artifactId>
    <version>2.3.2</version>
</dependency>

代码说明

示例代码涉及以下内容:
一、Jsoup的用法
       1、测试parse()方法
       2、测试connect()方法
       3、测试getElementsByAttribute()、getElementsByTag()、attr()(注意:本次attr用作获取)方法
       4、测试html()、text()方法
       5、测试attr()(注意:本次attr用作设置)、outerHtml()方法
二、JsoupXpath的用法
       1、测试sel()方法
       2、测试selNOne()方法
       3、测试selOne()方法
       4、测试selN()方法

示例代码

public class Test {
    public static void main(String[] args) throws IOException {
        System.out.println("一、Jsoup的用法");
        System.out.println("注意:下面案例中部分代码用到了JsoupXpath,目的是介绍Jsoup中内容的用法,不要见怪");
        // 1、测试parse()方法获取Document对象
        System.out.println("1、测试parse()方法,获取Document对象");
        // 以下参数中的是网页文件的全路径,这个文件就是我点击百科百度,搜索“Java(计算机编程语言)”,然后在网页空白处右键,选择“查看网页源代码”,然后将源代码保存到html文件中产生的,由于这个路径你不一定有,所以我暂时注释该写法
//        File file = new File("C:\\Users\\mingming\\Desktop\\Java(计算机编程语言).html");
//        Document doc = Jsoup.parse(file, "UTF-8");

        // 2、测试connect()方法获取Document对象
        System.out.println("2、测试connect()方法获取Document对象");
        Document doc = Jsoup.connect("https://baike.baidu.com/item/java/85979").timeout(1000 * 60 * 30).get();
        // 由于内容较多,所以只截取前1000个字符
        System.out.println("Document对象:" + doc.toString().replaceAll("[\r|\n|\b|\t]*", "").substring(0, 1000));

        // 3、测试getElementsByAttribute()、getElementsByTag()、attr()(注意:本次attr用作获取)的用法,下面代码的含义是用来获取链接地址所指向页面中的概述图片
        System.out.println("测试getElementsByAttribute()、getElementsByTag()、attr()(注意:本次attr用作获取)方法,下面代码的含义是用来获取链接地址所指向页面中的概述图片");
        JXDocument jxDocument = new JXDocument(doc.getAllElements());
        Object object = null;
        Element element = null;
        Object url = jxDocument.selOne("//div[@class='summary-pic']//a/@href");
        Document document = Jsoup.connect("https://baike.baidu.com" + url.toString()).timeout(1000 * 60 * 30).get();
        Elements picElements = document.getElementsByAttribute("data-sign");
        for (Element picElement : picElements) {
            String realUrl = picElement.getElementsByTag("img").get(0).attr("src").split("\\?")[0];
            Element element2 = picElement.getElementsByTag("img").get(0);
            String altValue = element2.attr("alt");
            System.out.println("图片名称:" + altValue + ";链接地址:" + realUrl);
        }

        // 4、测试html()、text()方法,获取摘要html代码和文本
        System.out.println("4、测试html()、text()方法,获取摘要html代码和文本");
        element = (Element) jxDocument.selOne("//div[@class='lemma-summary']");
        // 由于获取的html代码带有换行符等符号,去除后方便查看
        System.out.println("摘要html:" + element.html().replaceAll("[\r|\n|\b|\t]*", ""));
        System.out.println("摘要文本:" + element.text().replaceAll("[\r|\n|\b|\t]*", ""));

        // 5、测试attr()(注意:本次attr用作设置)、outerHtml()方法,设置文档中的第一张图片链接地址为百度Logo地址,然后返回html代码,本例不是真实例子,只为演示该功能使用
        System.out.println("5、测试attr()(注意:本次attr用作设置)、outerHtml()方法,设置文档中的第一张图片链接地址为百度Logo地址,然后返回html代码,本例不是真实例子,只为演示该功能使用");
        Elements imgElements = doc.getElementsByTag("img");
        imgElements.get(0).attr("src", "https://baike.baidu.com/pic/%E7%99%BE%E5%BA%A6/6699/0/86d6277f9e2f070828386172686eaf99a9014c085424?fr=lemma&ct=single");
        System.out.println("图片标签:" + imgElements.get(0).outerHtml().replaceAll("[\r|\n|\b|\t]*", ""));

        System.out.println("\n");

        System.out.println("二、JsoupXpath的用法");
        System.out.println("注意:xpath语法可以看:https://www.w3school.com.cn/xpath/index.asp");
        // 1、测试sel()方法,用来获取蓝色关键字,同时还可以学习xpath语法中starts-with的用法,以及starts-with和其他属性连用的用法
        System.out.println("1、测试sel()方法,用来获取蓝色关键字,同时还可以学习xpath语法中starts-with、contains、text()的用法");
        // starts-with:匹配一个属性开始位置内容的关键字,另外再说一下text()和contains的用法
        // contains:匹配一个属性值中包含的字符串;例如://input[contains(@name,"tip")]用于查找name属性中包含tip关键字的页面元素
        // text():匹配的是显示文本信息,此处也可以用来做定位用;例如://a[text()='百度搜索']或者//a[contains(text(),"百度搜索")],针对的数据是;<a href="http://www.baidu.com">百度搜索</a>
        List<Object> list = jxDocument.sel("//div[@class='para']//a[starts-with(@href,'/item') and @target='_blank']");
        if (list.size() != 0) {
            for (Object obj : list) {
                element = (Element) obj;
                String keyword = element.text();
                // 由于URL中含有汉字,所以百度百科中是编码形式的,我们需要进行解码
                String href = URLDecoder.decode(element.attr("href"), "UTF-8");
                System.out.println("关键字:" + keyword + ";链接:" + href);
            }
        }

        // 2、测试selNOne()方法,获取标题名称
        System.out.println("2、测试selNOne()方法,获取标题名称");
        JXNode node = jxDocument.selNOne("//dd[@class='lemmaWgt-lemmaTitle-title J-lemma-title']/h1");
        System.out.println("标题名称:" + node.asElement().text());

        // 3、测试selOne()方法,获取检索内容
        System.out.println("3、测试selOne()方法,获取检索内容");
        // 其中@content用来获取属性名称是content的属性值
        object = jxDocument.selOne("//meta[@name='description']/@content");
        System.out.println("检索内容:" + object.toString());

        // 4、测试selN()方法,获取目录
        System.out.println("4、测试selN()方法,获取目录");
        List<JXNode> nodes = jxDocument.selN("//div[@class='lemmaWgt-lemmaCatalog']//ol//li");
        String levelName = null;
        for (JXNode jxNode : nodes) {
            if (jxNode.asElement().className().contains("level1")) {
                levelName = jxNode.asElement().getElementsByTag("a").text();
                System.out.println("一级目录:" + levelName);
            } else if (jxNode.asElement().className().contains("level2")) {
                levelName = jxNode.asElement().getElementsByTag("a").text();
                System.out.println("    二级目录:" + levelName);
            }
        }
    }
}

执行结果

一、Jsoup的用法
注意:下面案例中部分代码用到了JsoupXpath,目的是介绍Jsoup中内容的用法,不要见怪
1、测试parse()方法,获取Document对象
2、测试connect()方法获取Document对象
Document对象:<!doctype html><!--STATUS OK--><html> <head>   <meta charset="UTF-8">   <meta http-equiv="X-UA-Compatible" content="IE=Edge">   <meta name="referrer" content="always">   <meta name="description" content="Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等。">   <title>Java(计算机编程语言)_百度百科</title>   <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon">   <link rel="icon" sizes="any" mask href="http://baikebcs.bdimg.com/cms/static/baike-icon.svg">   <meta name="csrf-token" content="">   <meta itemprop="dateUpdate" content="2021-09-08 09:19:37">   <meta name="keywords" content="Java, Java发展历程, Java编程开发, Java语言特点, Java工作原理, Java语言基础, Java语言标准, Java语言规范, Java技术应用, Java学习指南, Java语言评价">   <link rel="alternate" hreflang="x-default" href="https://baike.baidu.com/item/Java/85979">   <link rel="alternate" hreflang="zh"
测试getElementsByAttribute()getElementsByTag()attr()(注意:本次attr用作获取)的用法,下面代码的含义是用来获取链接地址所指向页面中的概述图片
图片名称:Java;链接地址:https://bkimg.cdn.bcebos.com/pic/14ce36d3d539b6003af33a98ab1f222ac65c103819c7
4、测试html()text()方法,获取摘要html代码和文本
摘要html:<div class="para" label-module="para"> Java是一门 <a target="_blank" href="/item/%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1">面向对象</a>编程语言,不仅吸收了 <a target="_blank" href="/item/C%2B%2B">C++</a>语言的各种优点,还摒弃了C++里难以理解的 <a target="_blank" href="/item/%E5%A4%9A%E7%BB%A7%E6%89%BF">多继承</a><a target="_blank" href="/item/%E6%8C%87%E9%92%88/2878304" data-lemmaid="2878304">指针</a>等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程 <sup class="sup--normal" data-sup="1" data-ctrmap=":1,"> [1]</sup> <a class="sup-anchor" name="ref_[1]_12654100">&nbsp;</a></div><div class="para" label-module="para"> Java具有简单性、面向对象、 <a target="_blank" href="/item/%E5%88%86%E5%B8%83%E5%BC%8F/19276232" data-lemmaid="19276232">分布式</a><a target="_blank" href="/item/%E5%81%A5%E5%A3%AE%E6%80%A7/4430133" data-lemmaid="4430133">健壮性</a><a target="_blank" href="/item/%E5%AE%89%E5%85%A8%E6%80%A7/7664678" data-lemmaid="7664678">安全性</a>、平台独立与可移植性、 <a target="_blank" href="/item/%E5%A4%9A%E7%BA%BF%E7%A8%8B/1190404" data-lemmaid="1190404">多线程</a>、动态性等特点 <sup class="sup--normal" data-sup="2" data-ctrmap=":2,"> [2]</sup> <a class="sup-anchor" name="ref_[2]_12654100">&nbsp;</a> 。Java可以编写 <a target="_blank" href="/item/%E6%A1%8C%E9%9D%A2%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F/2331979" data-lemmaid="2331979">桌面应用程序</a><a target="_blank" href="/item/Web%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F">Web应用程序</a><a target="_blank" href="/item/%E5%88%86%E5%B8%83%E5%BC%8F%E7%B3%BB%E7%BB%9F/4905336" data-lemmaid="4905336">分布式系统</a><a target="_blank" href="/item/%E5%B5%8C%E5%85%A5%E5%BC%8F%E7%B3%BB%E7%BB%9F/186978" data-lemmaid="186978">嵌入式系统</a>应用程序等 <sup class="sup--normal" data-sup="3" data-ctrmap=":3,"> [3]</sup> <a class="sup-anchor" name="ref_[3]_12654100">&nbsp;</a></div>
摘要文本:Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程 [1]  。 Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点 [2]  。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等 [3]5、测试attr()(注意:本次attr用作设置)outerHtml()方法,设置文档中的第一张图片链接地址为百度Logo地址,然后返回html代码,本例不是真实例子,只为演示该功能使用
图片标签:<img class="sl-player-el-img" src="https://baike.baidu.com/pic/%E7%99%BE%E5%BA%A6/6699/0/86d6277f9e2f070828386172686eaf99a9014c085424?fr=lemma&amp;ct=single">


二、JsoupXpath的用法
注意:xpath语法可以看:https://www.w3school.com.cn/xpath/index.asp
1、测试sel()方法,用来获取蓝色关键字,同时还可以学习xpath语法中starts-with、contains、text()的用法
关键字:面向对象;链接:/item/面向对象
关键字:C++;链接:/item/C++
关键字:多继承;链接:/item/多继承
关键字:指针;链接:/item/指针/2878304
关键字:分布式;链接:/item/分布式/19276232
关键字:健壮性;链接:/item/健壮性/4430133
关键字:安全性;链接:/item/安全性/7664678
关键字:多线程;链接:/item/多线程/1190404
关键字:桌面应用程序;链接:/item/桌面应用程序/2331979
关键字:Web应用程序;链接:/item/Web应用程序
关键字:分布式系统;链接:/item/分布式系统/4905336
关键字:嵌入式系统;链接:/item/嵌入式系统/186978
关键字:智能化;链接:/item/智能化
关键字:帕特里克;链接:/item/帕特里克/4831889
关键字:詹姆斯·高斯林;链接:/item/詹姆斯·高斯林
关键字:加利福尼亚;链接:/item/加利福尼亚
关键字:门洛帕克;链接:/item/门洛帕克
关键字:C++;链接:/item/C++
关键字:硬件;链接:/item/硬件
关键字:跨平台;链接:/item/跨平台
关键字:二进制;链接:/item/二进制
关键字:字节码;链接:/item/字节码
关键字:半导体芯片;链接:/item/半导体芯片
关键字:Oak;链接:/item/Oak
关键字:面向对象语言;链接:/item/面向对象语言
关键字:万维网;链接:/item/万维网
关键字:Mosaic;链接:/item/Mosaic
关键字:因特网;链接:/item/因特网
关键字:远景;链接:/item/远景
关键字:IT;链接:/item/IT/16684878
关键字:Applet;链接:/item/Applet
关键字:IBM;链接:/item/IBM/9190
关键字:Apple;链接:/item/Apple/3860362
关键字:DEC;链接:/item/DEC
关键字:Adobe;链接:/item/Adobe
关键字:HP;链接:/item/HP
关键字:Oracle;链接:/item/Oracle
关键字:e;链接:/item/e
关键字:微软;链接:/item/微软
关键字:J2ME;链接:/item/J2ME
关键字:J2SE;链接:/item/J2SE
关键字:J2EE;链接:/item/J2EE
关键字:HotSpot;链接:/item/HotSpot
关键字:Apple;链接:/item/Apple/3860362
关键字:XML;链接:/item/XML
关键字:JavaEE;链接:/item/JavaEE
关键字:JavaME;链接:/item/JavaME
关键字:JDK;链接:/item/JDK/1011
关键字:Java API;链接:/item/Java API
关键字:JRE;链接:/item/JRE
关键字:JRE;链接:/item/JRE
关键字:Eclipse;链接:/item/Eclipse/61703
关键字:NetBeans;链接:/item/NetBeans
关键字:IntelliJ IDEA;链接:/item/IntelliJ IDEA
关键字:MyEclipse;链接:/item/MyEclipse
关键字:Genuitec;链接:/item/Genuitec
关键字:EditPlus;链接:/item/EditPlus
关键字:编译器;链接:/item/编译器
关键字:Javac;链接:/item/Javac
关键字:C++;链接:/item/C++
关键字:break;链接:/item/break/405784
关键字:continue;链接:/item/continue/3009735
关键字:overload;链接:/item/overload/5090058
关键字:class;链接:/item/class/12502737
关键字:Package;链接:/item/Package
关键字:java.awt;链接:/item/java.awt
关键字:java.io;链接:/item/java.io
关键字:java.net;链接:/item/java.net
关键字:stream;链接:/item/stream
关键字:轻量级;链接:/item/轻量级/10002835
关键字:隐式声明;链接:/item/隐式声明
关键字:讹误;链接:/item/讹误
关键字:恶意代码;链接:/item/恶意代码
关键字:存储器;链接:/item/存储器
关键字:声明;链接:/item/声明/13130358
关键字:CPU;链接:/item/CPU
关键字:Thread;链接:/item/Thread/5156974
关键字:synchronized;链接:/item/synchronized
关键字:记事本;链接:/item/记事本/2519
关键字:写字板;链接:/item/写字板
关键字:UltraEdit;链接:/item/UltraEdit
关键字:Eclipse;链接:/item/Eclipse/61703
关键字:MyEclipse;链接:/item/MyEclipse
关键字:字符;链接:/item/字符
关键字:布尔值;链接:/item/布尔值
关键字:十进制;链接:/item/十进制
关键字:八进制;链接:/item/八进制
关键字:十六进制;链接:/item/十六进制
关键字:char;链接:/item/char/5156054
关键字:boolean;链接:/item/boolean
关键字:true;链接:/item/true/9955400
关键字:false;链接:/item/false
关键字:String;链接:/item/String/5137266
关键字:JCP;链接:/item/JCP
关键字:RI;链接:/item/RI
关键字:TCK;链接:/item/TCK
关键字:Java ME;链接:/item/Java ME
关键字:Java SE;链接:/item/Java SE
关键字:Java EE;链接:/item/Java EE
关键字:XML;链接:/item/XML
关键字:OSS;链接:/item/OSS/3505559
关键字:JAIN;链接:/item/JAIN
关键字:JSR;链接:/item/JSR
关键字:Android;链接:/item/Android/60243
关键字:JVM;链接:/item/JVM
关键字:封装;链接:/item/封装/2796965
关键字:金融服务业;链接:/item/金融服务业
关键字:frameworks;链接:/item/frameworks
关键字:KB;链接:/item/KB/331
关键字:HBase;链接:/item/HBase
关键字:Java从入门到精通(第3版);链接:/item/Java从入门到精通(第3版)
关键字:疯狂Java讲义;链接:/item/疯狂Java讲义
关键字:Java编程思想(第4版);链接:/item/Java编程思想(第4版)
关键字:INTERNET;链接:/item/INTERNET/272794
关键字:服务器;链接:/item/服务器
关键字:JSP;链接:/item/JSP/141543
关键字:JAVA SCRIPT;链接:/item/JAVA SCRIPT
关键字:HTML;链接:/item/HTML
关键字:Web;链接:/item/Web/150564
2、测试selNOne()方法,获取标题名称
标题名称:Java
3、测试selOne()方法,获取检索内容
检索内容:Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等。
4、测试selN()方法,获取目录
一级目录:发展历程
一级目录:编程开发
    二级目录:编程环境
    二级目录:编程工具
一级目录:语言特点
一级目录:工作原理
一级目录:语言基础
    二级目录:基本数据结构
    二级目录:关键字
    二级目录:运算符
    二级目录:程序举例
一级目录:语言标准
一级目录:语言规范
一级目录:技术应用
一级目录:学习指南
    二级目录:考试
    二级目录:教材
一级目录:语言评价
    二级目录:发展前景
    二级目录:贡献及影响力

参考文档

  1. Jsoup快速入门,对应pdf文档是:链接:https://pan.baidu.com/s/1-wor7kQaXfYMbc1t_TlCZA 提取码:401i
  2. Java开源的支持xpath的html解析器介绍–JsoupXpath
  3. xpath定位中starts-with、contains和text()的用法
  4. Jsoup(一)Jsoup详解(官方)
  5. Jsoup和JsoupXpath使用方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值