Java爬虫框架Jsoup学习记录
Jsoup的作用
当你想获得某网页的内容,可以使用此框架做个爬虫程序,爬某图片网站的图片(先获得图片地址,之后再借助其他工具下载图片)或者是小说网站的小说内容
我使用Jsoup写出的一款小说下载器,小说下载器
Jsoup导入
1. 使用gradle导入
compile 'org.jsoup:jsoup:1.11.1'
2. 第三方包导入
Jsoup使用
1. 获得Document
-
本地html文件或者使用javaIO流,则使用静态方法
parse
方法Document document = Jsoup.parse("D:\\test.html");
-
网址的话使用静态方法
connect().get()
Document document = Jsoup.connect("https://www.baidu.com").get();
2. 根据id找到某标签 document.getElementById
因为id
是唯一的,所以找到唯一的一个Element
Element element = document.getElementById("id名");
3. 根据class找到某标签 document.getElementsByClass
class可能不止一个,所以这里返回的是一个Elemnts
数组
Elements elements = document.getElementsByClass("d_title").select("h1");
4. 获得标签的内容 element.text()
例如html文件中有段代码为
<a id="title">hello world</a>
获得a标签的内容的代码为
Element element = document.getElementById("title");
String s = element.text();
5. 获得标签的属性 element.attr()
有段代码如下:
<a id="main" href="www.baidu.com"></a>
获得a标签的链接地址
Element element = document.getElementById("main");
String url = element.attr
String s = element.text();
6. 选择固定标签(li,p,a等)element.select("a")
返回的是Elements
数组
例如html文件中有段代码为
<div id="main"><a>hello world!</a></div>
获得a标签的内容代码为
Element element = document.getElementById("main");
Elements elements = element.select("a");
for(int i=0;i<elements.size();i++){
String s = elements.get(i).text();
}
获取p标签不能换行
有段代码
<div id="main">
<p>hello world</p>
<p>this is my name</p>
</div>
我们由id找到了element,我们想要获得p标签的内容,怎么办呢?
刚开始我想的也是使用select方法来选择p标签,但是,没有其作用
正确的方法应该是使用element.text方法获得内容,但是获得的内容全是一行的(段落之间是用空格隔开的)
我们想要每个p标签的内容独占一行,怎么办呢?
我们直接把空格替换成\n
即可
String string = element.text().replaceAll(" ","\n");
另外一种方法,如果感觉上面的方法不好用的话(有些小说原本就有些多余的空格),那么就使用下面的方法
Element element = document.getElementById("main");
String text = Jsoup.clean(element.html(), "", Whitelist.none(), new Document.OutputSettings().prettyPrint(false));//保存p标签换行
上面的获得的内容还有 
标志(html的空格标志),我们还得删除这个标志以及多余的空行
/**
* 处理空行和“ ”标志
* @param input 内容
* @return 处理过后的结果
*/
public static String deleteCRLFOnce(String input) {
return input.replaceAll("((\r\n)|\n)[\\s\t ]*(\\1)+", "$1").replaceAll(" ", "");
}