爬蟲實戰:頁面解析詳細指南(正則表示式、XPath、jsoup、Gson)
爬蟲的第二步,是對原始碼進行解析,提煉出目標內容。
本篇我們主要介紹以下 4 種常用的解析技術:
- 正則表示式
- XPath
- jsoup
- Gson
正則表示式
正則表示式(Regular Expression),電腦科學的一個概念。通常被用來檢索、替換那些符合某個規則的文字。
在爬蟲程式中,隨處可見正則表示式的影子。無論是 URL 篩選過濾,還是正文內容解析,都離不開正則表示式的支援。可以這麼說,如果沒有正則表示式,那麼開發者將很難編寫一個完整的爬蟲程式。
如果之前沒有接觸過正則表示式,可以通過以下教程快速入門:
Java 與正則表示式相關的類主要在 java.util.regex 包中。在 Java 中使用正則表示式,首先就要掌握 regex 包中的 Pattern 類與 Matcher 類。二者的作用如下表所示:
class name | introduction |
---|---|
Pattern | 表示一個已經編譯好的正則表示式 |
Matcher | 通過 Pattern 例項對任意字元序列進行匹配的引擎 |
使用 Pattern 與 Matcher 實現正則匹配,需要以下步驟:
- 通過
Pattern.compile(String regex)
建立一個不可變的、執行緒安全的 Pattern 例項; - 通過
Pattern.matcher(CharSequence input)
獲得 Matcher 類例項; - 使用 Matcher 類的
find()
方法對任意字元序列進行匹配(matches()
lookingAt()
方法也可以實現匹配功能); - 通過 Matcher 類的
group(int group)
返回匹配到的子字串。
下面,我們嘗試使用正則表示式從以下 HTML 文字中解析出節點 P 中的文字資訊。
<html>
<body>
<p>今天的日期是:2017-11-11</p>
</body>
</html>
package demo;
import util.FileUtils;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 正則表示式 demo
*
* @author panda
* @date 2017/11/12
*/
public class RegexDemo {
private static Pattern DATE_PATTERN = Pattern.compile("<p>(.*?)</p>");
public static void main(String[] args) {
String htmlBody = FileUtils.readFile("test.html", "UTF-8");
System.out.println(htmlBody);
Matcher matcher = DATE_PATTERN.matcher(htmlBody);
if (matcher.find()) {
String[] s = new String[matcher.groupCount() + 1];
for (int i = 0; i <= matcher.groupCount(); i++) {
s[i] = matcher.group(i);
}
System.out.println(s[1]);
}
}
}
執行主函式後,控制檯輸出如下資訊:
<html> <body> <p>今天的日期是:2017-11-11</p> </body></html>
今天的日期是:2017-11-11
XPath
XPath 是一門在 XML 文件中查詢資訊的語言,可用來在 XML 文件中對元素和屬性進行遍歷。它可以通過路徑表示式在樹狀資料結構中選取指定節點或節點集。
由於 HTML 和 XML 一樣擁有樹狀資料結構,因此 XPath 同樣適用 HTML 文件。
在 Java 中使用 XPath,需要引入以下 jar 包:
- xalan.jar
- nekohtml.jar
- xml-apis.jar
通過 XPath 實現 HTML 文件解析,一般需要以下步驟:
- 通過 nekehtml.jar 中 DOMParser 類的
parse(InputSource var1)
方法獲取一個 Document 例項; - 通過 xalan.jar 中的 XPathAPI,實現節點或節點集的選取;
- 通過 Node 介面提取節點屬性與節點資訊。
下面,我們嘗試使用 XPath 來解析出上述 HTML 文件中 P 節點的文字資訊。
package demo;
import org.apache.xpath.XPathAPI;
import org.cyberneko.html.parsers.DOMParser;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.xml.sax.InputSource;
import util.FileUtils;
import java.io.ByteArrayInputStream;
import java.io.InputStreamReader;
/**
* XPath demo
*
* @author panda
* @date 2017/11/18
*/
public class XPathDemo {
public static void main(String[] args) {
String htmlBody = FileUtils.readFile("test.html", "UTF-8");
System.out.println(htmlBody);
try {
DOMParser parser = new DOMParser();
parser.setFeature("http://xml.org/sax/features/namespaces", false);
parser.setProperty(
"http://cyberneko.org/html/properties/default-encoding",
"UTF-8");
ByteArrayInputStream in = new ByteArrayInputStream(htmlBody.getBytes());
InputStreamReader reader = new InputStreamReader(in);
InputSource source = new InputSource(reader);
parser.parse(source);
Document doc = parser.getDocument();
Node node = XPathAPI.selectSingleNode(doc, ".//P");
System.out.println(node.getTextContent());
} catch (Exception e) {
e.printStackTrace();
}
}
}
執行主函式後,我們可以在控制檯看到同樣的結果。
jsoup
jsoup 是一款 Java 的 HTML 解析器,可直接解析某個 URL 地址、HTML 文字內容。它提供了一套非常強大的 API,可通過 DOM,CSS 以及類似於 jQuery 的操作方法來取出和操作資料。
實際上,jsoup 與 XPath 非常相似。
在 Java 中使用 jsoup,同樣需要我們引入 jar 包:
- jsoup-1.10.2.jar
通過 jsoup 解析 HTML 文件,需要以下步驟:
- 通過
Jsoup.parse(String html)
獲取一個 Document 例項(注意,不是 w3c 下的 Document); - 通過 Document 獲取 Element 物件或 Elements 集合;
- 通過 Element 獲取節點屬性和節點資訊。
下面,我們嘗試使用 jsoup 完成相同的解析需求。
package demo;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import util.FileUtils;
/**
* jsoup demo
*
* @author panda
* @date 2017/11/12
*/
public class JsoupDemo {
public static void main(String[] args) {
String htmlBody = FileUtils.readFile("test.html", "UTF-8");
System.out.println(htmlBody);
Document doc;
try {
doc = Jsoup.parse(htmlBody);
Elements elements = doc.getElementsByTag("P");
for (int i = 0; i < elements.size(); i++) {
Element element = elements.get(i);
System.out.println(element.text());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
執行主函式後,我們同樣能獲取相同的結果。
Gson
Gson 是 Google 提供的用於解析 Json 資料的開源類庫,相似的類庫還有 Jackson、FastJson 等。
使用 Gson,需新增 jar 包:
- gson-2.8.0.jar
一個簡單的 Gson 解析 Json 資料示例,需要以下步驟:
- 建立欄位與 Json 資料相對應的 POJO;
- 通過 Gson 例項的
fromJson(String json, Class<T> classOfT)
方法實現 Json 資料到 POJO 的對映; - 通過 POJO 欄位獲取目標內容。
現在,我們嘗試解析出以下 Json 資料中的資訊。
{
name:"panda",
age:18
}
package demo;
import com.google.gson.Gson;
import util.FileUtils;
/**
* Gson demo
*
* @author panda
* @date 2017/11/30
*/
public class GsonDemo {
public static void main(String[] args) {
String jsonString = FileUtils.readFile("json.txt", "UTF-8");
Gson gson = new Gson();
User user = gson.fromJson(jsonString, User.class);
System.out.println("name:" + user.name);
System.out.println("age:" + user.age);
}
private class User {
private String name;
private int age;
}
}
執行主函式後,獲取如下結果:
name:panda
age:18
相關推薦
爬蟲實戰:頁面解析詳細指南(正則表示式、XPath、jsoup、Gson)
爬蟲的第二步,是對原始碼進行解析,提煉出目標內容。 本篇我們主要介紹以下 4 種常用的解析技術: 正則表示式 XPath jsoup Gson 正則表示式 正則表示式(Regular Expression),電腦科學的一個概念。通常被用來檢索、替
(轉)應該是目前最詳細的(正則表示式)語音視訊講解教程
(轉)應該是目前最詳細的(正則表示式)語音視訊講解教程 優酷線上地址: http://v.youku.com/v_show/id_XMzg2ODE4MTQ5Mg==.html?x&sharefrom=android&sharekey=a9c982b1c99597d3e1b
JAVASCRIPT:檢查日期是否正確(正則表示式)
function checkDate(d){ var regx = /^(\d{4})-(\d{2})-(\d{2})$/ if (!regx.test(d)) { return false; } else { return true; } } 檢查日
android 開發--抓取網頁解析網頁內容的若干方法(網路爬蟲)(正則表示式)
網頁有兩種格式,一種是xml另一種是html,目前似乎好像大部分都是html格式的,檢視網頁格式的方法是在瀏覽器中右鍵-->檢視原始碼 一,XML解析的三大方法 (1) SAX: Simple API for XML SAX是一個解析速度快並且佔用記憶體少的XML解析
Python 3爬蟲網易雲(五)——每天進步一點點(正則表達式下篇之HTML標簽)
tdd htm python swf sofm pts 正則表達 eal href 51忠酶9euka杖淪28炊http://jz.docin.com/ngaxf40277 嵌擲Ic白冉qgw抑亢84http://jz.docin.com/fejci232 gw2d4永
Python爬蟲(正則表示式)
Python爬蟲(正則表示式) 最近接觸爬蟲比較多,下面我來展示一個剛爬取的成果,使用正則表示式的方法,希望對剛開始接觸爬蟲的小夥伴有所幫助,同時希望大佬們給予點評和指導 接下來,步入正題,使用正則表示式爬取資料是一種原始且有效的方法,正則表示式的作用即字元匹配,匹配出你想得到的
jsp頁面驗證手機號的正則表示式(最新)
jsp頁面校驗手機號(js): function checkMobile(){ var checkRole =/^0?(13[0-9]|15[012356789]|18[012346789]|1
Python:re模組(正則表示式)
#!/usr/bin/env python # coding:UTF-8 """ @version: python3.x @author:曹新健 @contact: [email protected] @software: PyCharm @file: re模組簡介.py @time:
python爬蟲的re庫(正則表示式匹配)
re庫是python中自帶的一個庫,不需要外部匯入。 它主要是支援正則表示式匹配。 下面來說一下其主要功能函式: 函式 說明 re.search() 在一個字串中搜索匹配正則表示式的第
詞法分析:從RE(正則表示式)到DFA(確定的有限狀態機)
模式識別(Pattern recognization)是現在非常流行的一個詞,我們對詞法的分析也是基於模式(pattern-based)的。我們用正則表示式(Regular Expression)來定義單詞的模式,而在詞法分析時,有限狀態機(Finite Aut
Python爬蟲四(正則表示式)
1.瞭解正則表示式正則表示式是對字串操作的一種邏輯公式,就是用事先定義好的一些特定字元、及這些特定字元的組合,組成一個“規則字串”,這個“規則字串”用來表達對字串的一種過濾邏輯。正則表示式是用來匹配字串非常強大的工具,在其他程式語言中同樣有正則表示式的概念,Python同樣不
Regularized least-squares classification(正則化最小二乘法分類器)取代SVM
得出 ack 提高 kernel sys 風險 重要 ref height 在機器學習或者是模式識別其中有一種重要的分類器叫做:SVM 。這個被廣泛的應用於各個領域。可是其計算的復雜度以及訓練的速度是制約其在實時的計算機應用的主要原因。因此也非常非常多的算法
C#Json文件解析,寫入,正則表示式轉換。Unity建立Json文件以及寫入。
C#: 解析: 解析工具:LitJson,JsonConvert &nb
【知識積累】(二)、深入Regex(正則表示式)
\:將下一個字元標記符、或一個向後引用、或一個八進位制轉義符。例如,“\\n”匹配\n。“\n”匹配換行符。序列“\\”匹配“\”而“\(”則匹配“(”。即相當於多種程式語言中都有的“轉義字元”的概念。 ^:匹配輸入字串的開始位置。如果設定了RegExp物件的Multiline屬性,^也匹配“\n
【知識積累】(一)、瞭解Regex(正則表示式)
一、正則表示式簡介 一種可以用於模式匹配和替換的規範,由普通字元 + 特殊字元構成一個模板,用於對目標字串進行匹配、查詢、替換、判斷。 原始碼:JDK1.4中的java.util.regex下的Pattern和Matcher類。 二、常用語法 1、字元取值範圍 [abc]:表示可能是a
字元?正則?bugku(正則表示式學習)
題目 通過讀程式碼可以看出只要我們構造出符合正則表示式的字串通過GET傳參傳過去就可以看到 key 即 flag 通過這道題看了很多正則表示式的語法規則…… ------------------------------------------------------------
2-Python爬蟲-正則表示式/XML/XPath/CSS
頁面解析和資料提取 結構資料: 先有的結構,在談資料 JSON檔案 JSON Path 轉換成Python型別進行操作(json類) XML檔案 轉換成python型別(xmltodict) X
js實驗-表單驗證(正則表示式)
<!DOCTYPE html> <html lang="en"> <head> <title>Document</title> </head> <script src="./1.js"></s
python學習之-re模組(正則表示式模組)
什麼是正則表示式 正則就是用一些具有特殊含義的符號組合到一起(稱為正則表示式)來描述字元或者字串的方法。或者說:正則就是用來描述一類事物的規則。(在Python中)它內嵌在Python中,並通過 re 模組實現。正則表示式模式被編譯成一系列的位元組碼,然後由用 C 編寫的匹配引擎執行。 生活中處處都是正則
python之re模組(正則表示式)常用函式
1、compile() 編譯正則表示式模式,返回一個物件的模式。(可以把那些常用的正則表示式編譯成正則表示式物件,這樣可以提高一點效率。) 格式: re.compile(pattern,flags=0) pattern: 編譯時用的表示式字串。 flags 編譯標誌位,用於修改正