程序猿學社的GitHub,歡迎Star
github技術專題
本文已記錄到github
前言
從19年開始,社長,就在寫系列文章,整個系列寫完後,就需要寫一篇總結的文章,需要把所有的文章歸納進去。相信不少童鞋都會有這種困惑。
需求
通過csdn系列文章的網站,採用jsoup,輸出該系列文章的所有標題和url地址。使用MD方式網址輸出
要求
- 需要有一定的css、html、js前端基礎
- 有一定的java基礎
api接口文檔
查找元素
方法 | 描述 |
---|---|
getElementById(String id) | 根據id選擇器獲取Element |
getElementsByTag(String tagName) | 通過標籤過濾獲取Element |
getElementsByClass(String className) | 通過類樣式選擇器獲取Element |
getElementsByAttribute(String key) | 通過屬性名獲取Element |
獲取元素的值
方法 | 描述 |
---|---|
attr(String attributeKey) | 獲取屬性的值 |
attr(String attributeKey, String attributeValue) | 給屬性賦值 |
text() | 獲取對應的值,只是單純的值 |
html() | 獲取對應的html值,包含標籤 |
實戰
pom.xml
<!--爬取數據關鍵jsoup -->
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.10.3</version>
</dependency>
- 導入jsoup依賴
代碼
package com.cxyxs.jsoup.util;
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.net.URL;
/**
* Description:測試
* Author: 程序猿學社
* Date: 2020/5/10 18:07
* Modified By:
*/
public class JsoupUtils {
public static void main(String[] args) throws Exception {
getList("https://blog.csdn.net/qq_16855077/category_9722768.html");
}
/**
* 通過csdn的系列文章網址輸出對應的內容
* @param url
* @throws Exception
*/
public static void getList(String url)throws Exception{
//網址
Document document = Jsoup.connect(url).get();
// 獲取標題
//String title = document.title();
//獲取頭部信息
//Element head = document.head();
//取到菜單列表ul
Elements elements = document.getElementsByClass("column_article_list");
//取出每個li
Elements elementsByTag = elements.get(0).getElementsByTag("li");
for (Element el : elementsByTag) {
//取出每個li元素的href
String href = el.getElementsByTag("a").attr("href");
//先取出h2標籤
String titleDiv = el.getElementsByTag("h2").text();
String[] titles = titleDiv.split(" ");
System.out.println("!["+titles[1]+"]("+href+")");
}
}
}
到這裏,我們就實現了通過csdn列表的網址,輸出markdown的列表的內容格式。是不是感覺很so easy哦?
- 也有不少人通過httpclient方法實現,當然,通過這種方法也可以實現。說說實現的大致思路。首先通過網址獲取整個html,而且通過自己各種寫判斷處理,因太麻煩,不建議採用這種方式。
看到這裏是不是一臉懵逼?別急,我們一步一步的分析一下社長的代碼,爲什麼要這樣編寫。
分析
第一步
Document document = Jsoup.connect(url).get();
- 這裏的document,我們通過syso輸出,可以知道實際上,就是把url對應網址輸出。等同於,我們在網頁輸入F12,進入開發者調試模式
- 輸出的內容就是整個html頁面,也就是紅色區域的內容。
- 到這一步,我們已經實現,取到整個html頁面。
第二步 獲取文章列表的ul
- 點擊紅色區域的圖標,把他移動到,我們我們需要選擇的標題這一行上面。
- 分析csdn前端開發是如何顯示文章列表的
- 通過分析,可以看出,最外層是ul,裏面的每一篇文章的顯示都是一個li。例如10篇文章,就有10個li。
//取到菜單列表ul
Elements elements = document.getElementsByClass("column_article_list");
這裏爲什麼要調用getElementsByClass方法?
- ul標籤上是class屬性,值爲column_article_list,通過社長之前的api接口文檔,可知,class選擇器需要調用getElementsByClass。
- 到這裏,我們已經實現從整個html變爲只獲取ul的內容。萬里長征又進了一步。
第三步 獲取文章的每個li
//取出每個li
Elements elementsByTag = elements.select("li");
for (Element el : elementsByTag) {
//取出每個li元素的href
String href = el.getElementsByTag("a").attr("href");
//先取出h2標籤
String titleDiv = el.getElementsByTag("h2").text();
String[] titles = titleDiv.split(" ");
//![描述](網址)
System.out.println("!["+titles[1]+"]("+href+")");
}
- elements.select(“li”) 獲取所有li標籤的html元素
一步一步再來剖析
Elements elementsByTag = elements.select("li");
- 在ul中,獲取li,實際上返回如下
分析單個的li,發現只需要取到href對應的屬性值,h2標籤就可以實現我們的功能。
獲取href的值
String href = el.getElementsByTag("a").attr("href");
- getElementsByTag獲取a標籤這個dom元素
- attr(“href”)爲獲取當前dom元素屬性爲href的值
獲取標題的值
//先取出h2標籤
String titleDiv = el.getElementsByTag("h2").text();
String[] titles = titleDiv.split(" ");
- titles[1] 爲文章標題的值
獲取標題的值,爲什麼要這些寫?
通過查看html代碼,發現h2裏面有一個span標籤,裏面的值爲文章類型(原創、轉載),緊接着就是文字標題。 - 沒有辦法,通過標籤選擇器篩選到標題的值,社長想到的方法,獲取h2的text的值,這樣我們去到的內容爲"原創 [多線程XXX] 十四面試官說:說說java中XXXX"
- 把這個字符串按空格切割,取索引爲1的值,就是我們的標題
結論
本文最好有一定的前端基礎,不然,看着,會有點懵逼。如果你懂js、css、html,你再去看jsoup提供的api接口,會發現,幾乎完全類似。
本文僅供學習,本文只是讀取個人博客專欄的一個地址,獲取每個文章的標題和網址,方便專欄文章彙總。如有問題,請聯繫我刪除
作者:程序猿學社
原創公衆號:『程序猿學社』,專注於java技術棧,分享java各個技術系列專題,以及各個技術點的面試題。
原創不易,轉載請註明來源(註明:來源於公衆號:程序猿學社, 作者:程序猿學社)。