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);
}
}
}
}

原文地址:https://www.cnblogs.com/Xiaoming0/p/14065161.html