zoukankan      html  css  js  c++  java
  • java爬虫(jsoup)

    XML的解析:
    操作xml文档,将文档中的数据读取到内存中。

    操作xml文档

    解析(读取):将文档中的数据读取到内存中

    写入:将内存中的数据保存到xml文档中,持久化的存储。

    解析xml的方式:

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

    优点:操作方便,可以对文档进行CRUD的所有操作

    缺点:占内存

    SAX:逐行读取,基于事件驱动的。

    优点:不占内存

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

    xml常见的解析器

    JAXP:sun公司提供的解析器,支持dom和sax两种思想。

    DOM4J:一款非常优秀的解析器

    Jsoup:jsoup是一款java的html解析器,可直接解析某个url地址,html文本内容。它提供了一套非常省力的api,可通过dom,css以及类似于jquery的操作方法来取出和操作数据。

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

    Jsoup:jsoup是一款java的html解析器,可直接解析某个url地址,html文本内容。它提供了一套非常省力的api,可通过dom,css以及类似于JQuery的操作方式来取出和操作数据。

    快速入门:

    步骤:

    导入jar包。

    获取Document对象

    获取对应的标签

    获取数据

    package jsoup;

    /*
    jsoup快速入门
    */

    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;

    public class Demo01 {
    public static void main(String[] args) throws IOException {
    //2.获取document对象,根据xml文档获取
    //2.1获取student.xml的path
    String path = Demo01.class.getClassLoader().getResource("student.xml").getPath();
    //2.2解析xml文档,加在文档进内存,获取dom树
    Document document = Jsoup.parse(new File(path),"utf-8");
    //3获取元素对象
    Elements elements = document.getElementsByTag("name");

    System.out.println(elements.size());
    //3.1获取第一个name对象
    Element element = elements.get(0);
    //3.2获取数据
    String name = element.text();
    System.out.println(name);
    }
    }
    Jsoup对象
    对象的使用:

    Jsoup:工具类,可以解析html或xml文档,返回document

    parse:解析html和xml文档,返回document

    parse(File in,String charsetName):解析xml或html文件的。

    parse(String html):解析xml或html字符串

    parse(URL url,int timeoutMillis):通过网络路径获取指定的html或xml的文档对象

    代码演示:
    package jsoup;

    /*
    jsoup对象功能
    */

    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 Demo02 {
    public static void main(String[] args) throws IOException {
    //2.获取document对象,根据xml文档获取
    //2.1获取student.xml的path
    String path = Demo02.class.getClassLoader().getResource("student.xml").getPath();
    //2.2解析xml文档,加在文档进内存,获取dom树
    Document document = Jsoup.parse(new File(path),"utf-8");
    System.out.println(document);

    //2.parse(String html):解析xml或html字符串
    String str = " " +
    " " +
    " " +
    " " +
    " <student number="s001"> " +
    " 张三 " +
    " 23 " +
    " " +
    " " +
    " " +
    " <student number="s002"> " +
    " 李四 " +
    " 24 " +
    " " +
    " " +
    "
    ";
    Document document1 = Jsoup.parse(str);
    System.out.println(document1);

    //3.parse(URL url,int timeoutMillis):通过网络路径获取指定的html或xml的文档对象
    URL url = new URL("https://baike.baidu.com/item/jsoup/9012509?fr=aladdin");//代表网络中的一个资源路径
    Document document2 = Jsoup.parse(url,1000);
    System.out.println(document2);
    }
    }
    Document:文档对象。代表内存中的dom树。

    获取Element对象

    getElementByTag(String tagName):根据标签名称获取元素对象集合

    getElementByAttribute(String key):根据属性名称获取元素对象集合

    getElementByAttributeValue(String key,String value):根据对应的属性名和属性值获取元素对象集合

    getElementById(String id):根据id属性值获取唯一的element值

    代码演示
    package jsoup;

    /*
    jsoup对象功能
    */

    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 Demo02 {
    public static void main(String[] args) throws IOException {
    //2.获取document对象,根据xml文档获取
    //2.1获取student.xml的path
    String path = Demo02.class.getClassLoader().getResource("student.xml").getPath();
    //2.2解析xml文档,加在文档进内存,获取dom树
    Document document = Jsoup.parse(new File(path), "utf-8");
    //3.获取元素对象
    //3.1获取所有student对象
    Elements elements = document.getElementsByTag("student");
    System.out.println(elements);
    System.out.println("----------------");

    //3.2获取属性名为id的元素对象
    Elements elements1 = document.getElementsByAttribute("id");
    System.out.println(elements1);
    System.out.println("----------------");

    //3.3获取number属性值为s001的对象
    Elements elements2 = document.getElementsByAttributeValue("number","s001");
    System.out.println(elements2);
    System.out.println("----------------");

    //3.4获取id属性值的元素对象
    Element itcast = document.getElementById("itcast");
    System.out.println(itcast);
    }
    }
    Elements:元素Element对象的集合。可以当做ArrayList来使用

    Element:元素对象

    获取子元素对象

    getElementByTag(String tagName):根据标签名称获取元素对象集合

    getElementByAttribute(String key):根据属性名称获取元素对象集合

    getElementByAttributeValue(String key,String value):根据对应的属性名和属性值获取元素对象集合

    getElementById(String id):根据id属性值获取唯一的element值

    获取属性值

    String attr(String key):根据属性名称获取属性值

    获取文本内容

    String text():获取文本内容

    String html():获取标签体的所有内容

    package jsoup;

    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;

    public class Demo03 {
    public static void main(String[] args) throws IOException {
    //2.获取document对象,根据xml文档获取
    //2.1获取student.xml的path
    String path = Demo02.class.getClassLoader().getResource("student.xml").getPath();
    //2.2解析xml文档,加在文档进内存,获取dom树
    Document document = Jsoup.parse(new File(path), "utf-8");
    /*
    Element:元素对象
    1. 获取子元素对象
    - getElementByTag(String tagName):根据标签名称获取元素对象集合
    - getElementByAttribute(String key):根据属性名称获取元素对象集合
    - getElementByAttributeValue(String key,String value):根据对应的属性名和属性值获取元素对象集合
    - getElementById(String id):根据id属性值获取唯一的element值
    2. 获取属性值
    - String attr(String key):根据属性名称获取属性值
    3. 获取文本内容
    - String text():获取文本内容
    - String html():获取标签体的所有内容
    */
    //通过Document对象获取name标签,获取所有的name标签,可以获取到两个
    Elements elements = document.getElementsByTag("name");
    System.out.println(elements.size());
    System.out.println("----------------");

    //通过Element对象获取子标签对象
    Element element_student = document.getElementsByTag("student").get(0);
    Elements ele_name = element_student.getElementsByTag("name");
    System.out.println(ele_name.size());
    System.out.println("----------------");

    //获取student对象的属性值
    String number = element_student.attr("NUMBER");
    System.out.println(number);
    System.out.println("----------------");

    //获取文本内容
    String text = ele_name.text();
    String html = ele_name.html();
    System.out.println(text);
    System.out.println(html);
    }
    }
    Node:节点对象

    快捷查询方式
    selector:选择器

    使用方法:Elements select(String cssQuery)

    语法: 参考Selector类中定义的语法

    package jsoup;

    /*
    选择器查询
    */

    import com.sun.xml.internal.ws.addressing.WsaActionUtil;
    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;

    public class Demo04 {
    public static void main(String[] args) throws IOException {
    //2.获取document对象,根据xml文档获取
    //2.1获取student.xml的path
    String path = Demo04.class.getClassLoader().getResource("student.xml").getPath();
    //2.2解析xml文档,加在文档进内存,获取dom树
    Document document = Jsoup.parse(new File(path),"utf-8");

    //查询name标签
    Elements elements = document.select("name");
    System.out.println(elements);

    //查询id值为itcast的元素
    Elements elements1 = document.select("#itcast");
    System.out.println(elements1);
    }
    }
    练习:爬取先知文章标题
    package jsoup;

    import org.jsoup.Jsoup;
    import org.jsoup.nodes.Document;
    import org.jsoup.nodes.Element;
    import org.jsoup.select.Elements;

    import java.io.IOException;
    import java.net.MalformedURLException;
    import java.net.URL;

    public class pachong1 {
    public static void main(String[] args) throws IOException {
    URL url = new URL("https://xz.aliyun.com/");
    Document document = Jsoup.parse(url,1000);

    Elements elements = document.getElementsByAttributeValue("class","topic-title");
    for (int i = 0; i < 10; i++) {
    Element element = elements.get(i);
    String text = element.text();
    System.out.println(text);
    }
    }
    }
    练习2:爬取文章内容
    package jsoup;

    import org.jsoup.Jsoup;
    import org.jsoup.nodes.Document;
    import org.jsoup.nodes.Element;
    import org.jsoup.select.Elements;

    import java.io.IOException;
    import java.net.MalformedURLException;
    import java.net.URL;

    public class pachong1 {
    public static void main(String[] args) throws IOException {
    URL url = new URL("https://xz.aliyun.com/");
    Document document = Jsoup.parse(url,1000);

    Elements elements = document.getElementsByAttributeValue("class","topic-title");
    for (int i = 0; i < 10; i++) {
    Element element = elements.get(i);
    String url1= element.attr("href");
    URL url2 = new URL("https://xz.aliyun.com/"+url1);
    Document document1 = Jsoup.parse(url2,1000);
    Elements elements1 = document1.getElementsByTag("p");
    for (int j = 0; j <10 ; j++) {
    Element element1 = elements1.get(j);
    String text = element1.text();
    System.out.println(text);
    }
    }
    }
    }

  • 相关阅读:
    HDU 5001 Walk (暴力、概率dp)
    Codeforces Round #265 (Div. 2) C 暴力+ 找规律+ 贪心
    zoj 3812 We Need Medicine (dp 状压)
    ZOJ
    ZOJ 3811 / 2014 牡丹江赛区网络赛 C. Untrusted Patrol bfs/dfs/并查集
    POJ 2411 状压dp
    HDU 3001 三进制 状压dp
    POJ 2096 (dp求期望)
    poj 3311 状压dp 最短路
    数据挖掘的基本概念
  • 原文地址:https://www.cnblogs.com/Xiaoming0/p/14065161.html
Copyright © 2011-2022 走看看