XML、Jsoup、Java爬虫

发布时间 2023-05-10 09:54:48作者: 华科爬虫

什么是XML?

是一种标记语言,很类似 HTML

XML 的设计宗旨是传输数据,而非显示数据

XML的操作类型

1、解析:将xml文档 数据读取到内存中

2、写入:将数据写入xml

解析 XML 方式

DOM:将标记语言文档,一次性加载进内存,在内存中形成一颗dom数

优点:可以像Dom树一样,对文档进行 curd

缺点:因为一次性加载全部加载,占内存很大

SAX:逐行读取,(读一行,释放前面一行)基于事件驱动的。

优点:不占内存。

缺点:只能读取,不能增删改。

总结:服务端:适合DOM。移动端:内存较小,适合SAX

常见的XML 解析器

JAXP:sun公司提供的解析器,支持dom和sax两种思想,官方,性能较烂。

DOM4j:一款非常优秀的解析器,非官方,但是性能更好

jsoup:是一款Java的html解析器,可直接解析某个URL地址、HTML文本内容,他提供了一套非常省力的API。

PULL:Android 操作系统内置解析器。基于sax方式

Jsoup 快速入门

导入Jar包

获取document对象

获取对应的标签 Element对象

获取数据

案例代码

老规矩 maven依赖

<dependency>
            <groupId>org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
            <version>1.12.1</version>
        </dependency>

然后开始写代码吧

这里自己创建一个.xml 文件 源码如下

<?xml version="1.0" encoding="UTF-8" ?>
<!-- 
	1.填写xml文档的根元素
	2.引入xsi前缀.  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	3.引入xsd文件命名空间.  xsi:schemaLocation="http://www.itcast.cn/xml  student.xsd"
	4.为每一个xsd约束声明一个前缀,作为标识  xmlns="http://www.itcast.cn/xml" 
 -->
<students xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xmlns="http://www.itcast.cn/xml"
          xsi:schemaLocation="http://www.itcast.cn/xml  student.xsd">
    
    <student number="persion1">
        <name>tom</name>

        <age>18</age>
        <sex>male</sex>
    </student>
    <student number="persion2">
        <name>lucy</name>
        <age>30</age>

        <sex>female</sex>
    </student>

</students>

创建好了,那就获取绝对路径 填入下面吧

@Test
    public void JsoupDemo1() throws IOException {
        Document parse = Jsoup.parse(new File("文件位置\\student.xml"), "utf-8");
        Elements name = parse.select("name"); //查询所有 name 标签集合
        Element element = name.get(0);  // 获取 第一个 name 标签
        String text1 = element.text();// 将其转为String
        System.out.println(text1); // tom

        Elements age = parse.select("age"); //查询所有age标签
        String text2 = age.get(1).text();  //将第2个 age 标签1 并转为 String
        System.out.println(text2); // 30
    }

总结一下:涉及到的对象 及其常用方法

Jsoup对象:工具类

pasre(File file,String charset) 用于解析文件形式的XML、HTML等

parse(String html) 用于解析String形式的XMl、HTML等

parse(Url url ,Int timeoutMillis) 用于解析网络形式的XML、HTML等 指定超时时间 可以做小爬虫

select(String cssQuery) 用于查询项目中所有名叫:cssQuery的标签内容

Document对象:文档对象。代表内存中的Dom树

getElementsByTag(String tagName):根据标签名称,获取元素集合 即Elments

getElementsByAtttibute(Stirng key):根据标签的属性名称,获取元素集合 即Elments

getElementsByAttributeValue(Stirng key):根据属性值,获取元素集合 即Elments

getElementsById(String id):根据标签id,获取元素集合 即Elments。不常用

Elements:元素Element对象的集合。可以理解成 ArrayList<Element> 去使用

getElementByTag(String tagName):根据标签名称,获取元素 即Elment

getElementByAtttibute(Stirng key):根据标签的属性名称,获取元素 即Elment

getElementByAttributeValue(Stirng key):根据属性值,获取元素 即Elment

getElementById(String id):根据标签id,获取元素 即Elment。不常用

get(int index) :获取索引为index的元素对象

body():将会对原来的Document添加一个<body> </body> 标签

Element:元素对象

attr(String key):根据属性名称获取属性值 可以获取 href 的连接

text():获取子标签的纯文本内容 不含”<>”,”</>”

html():获取子标签和文本内容的子标签所有内容 包含 “<>”,”</>”

Node:节点对象

案例代码2

将XML 内容替换一下

<?xml version="1.0" encoding="UTF-8" ?>
<!-- 
	1.填写xml文档的根元素
	2.引入xsi前缀.  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	3.引入xsd文件命名空间.  xsi:schemaLocation="http://www.itcast.cn/xml  student.xsd"
	4.为每一个xsd约束声明一个前缀,作为标识  xmlns="http://www.itcast.cn/xml"
 -->
<students xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xmlns="http://www.itcast.cn/xml"
          xsi:schemaLocation="http://www.itcast.cn/xml  student.xsd">

    <student number="persion1">
        <name>tom</name>
        <age id="888">18</age>
        <sex>male</sex>
    </student>
    <student number="persion2">
        <name>lucy</name>
        <age>30</age>
        <sex>female</sex>
    </student>

</students>

代码如下:

@Test
    public void JsoupDemo2() throws IOException {
        Document parse = Jsoup.parse(new File("D:\\GovBuy\\1688\\src\\main\\resources\\student.xml"), "utf-8");
        Elements elementsByTag = parse.getElementsByTag("name");
        /**
         * <name>
         *  tom
         * </name>
         * <name>
         *  lucy
         * </name>
         */

        Elements elementsByAttribute = parse.getElementsByTag("name"); // 获取所有名为 name 的 标签。
        /**
         * <name>
         *  tom
         * </name>
         * <name>
         *  lucy
         * </name>
         */

        Element elementById = parse.getElementById("888");
        /**
         * <age id="888">
         *  18
         * </age>
         */

        Elements elementsByAttributeValue = parse.getElementsByAttributeValue("number","persion2");
        /**
         * <student number="persion2">
         *  <name>
         *   lucy
         *  </name>
         *  <age>
         *   30
         *  </age>
         *  <sex>
         *   female
         *  </sex>
         * </student>
         */

        Elements elementsByAttributeValue1 = parse.getElementsByAttributeValue("id","888"); // 这里等价于 getElementById("888");
        /**
         * <age id="888">
         *  18
         * </age>
         */
    }

具体玩法,需要根据XML 、HTML形式处理。

完结!

爬取 人家连接的超链:

@Test
    public void Ahref() throws IOException {
        // 获取到DOM树
        Document parse = Jsoup.parse(new URL("百度一下,你就知道"),10000);
        // 获取到元素集合
        Elements elements = parse.select("a");
        // 遍历元素集合
        for (Element element : elements) {
            // 输出 元素中 属性为"href" 的属性值
            System.out.println(element.attr("href"));
        };
    }

间接 等价于

@Test
    public void AhrefByTag() throws IOException {
        // 获取到DOM树
        Document parse = Jsoup.parse(new URL("https://www.baidu.com"),10000);
        // 获取到元素集合
        Elements elements = parse.getElementsByTag("a");
        // 遍历元素集合
        for (Element element : elements) {
            // 输出 元素中 属性为"href" 的属性值
            System.out.println(element.attr("href"));
        };
    }

有点不明白

parse.select("a[href]"); 等价于 Elements elements = parse.select("a");