成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java進行HTML數據采集:淺談強大的group正則

開發 后端
作者主要從group正則表達式來說明如何幫助Java進行html頁面采集,所以對于不知道Java正則表達式的朋友們可以先去學習下(下面有鏈接)再閱讀本文。

簡  介

作為全球運用最廣泛的語言,Java 憑借它的高效性,可移植性(跨平臺),代碼的健壯性以及可強大的可擴展性,深受廣大應用程序開發者的喜愛. 作為一門強大的開發語言,正則表達式在其中的應用當然是必不可少的,而且正則表達式的掌握能力也是那些高級程序員的開發功底之體現,做一名合格的網站開發的程序員(尤其是做前端開發),正則表達式是必備的。

最近,由于一些需要,用到了java和正則,做了個的足球網站的數據采集程序,由于是***次做關于java的html頁面數據采集,必然在網上查找了很多資料,但是發現運用如此廣泛的java在使用正則做html采集方面的(中文)文章是少之又少,都是簡單的談了下java正則的概念,沒有真正用在實際網頁html采集,所以實例教程更是***(雖然java有它自己的Html Parser,而且十分強大),但個人覺得作為如此深入人心的正則表達式,理應有其相關的java實例教程,而且應該很多很全.于是在完成java版的html數據采集程序之后,本人便打算寫個關于正則表達式在java上的html頁面采集,以便有相關興趣的讀者更好的學習。

 

關于group正則

說到正則表達式是如何幫助java進行html頁面采集,這里簡要需要提一下正則表達式中的group方法:

  1. public static void main(String[] args){   
  2.        //Pattern 用于編譯正則  這里用到了3個正則 分別用括號()包住  
  3.        //匹配URL 當然這里的正則不一定準確 這個匹配URL的正則就是錯誤的 只是在這里剛好能匹配出來  
  4.        //第2個正則是用于匹配標題 SoFlash的
  5.        //第3個正則用于匹配日期  
  6.        /*這里只用了一條語句便把url,標題和日期全部給匹配出來了*/   
  7.        Pattern p = Pattern.compile("='(\\w.+)'>(\\w.+[a-zA-Z])-(\\d{1,2}\\.\\d{1,2}\\.\\d{4})");   
  8.        String s = "<a href='www.cnblogs.com/longwu'>SoFlash-12.22.2011</a>";   
  9.        Matcher m = p.matcher(s);  
  10.        while(m.find()){  
  11.            //通過調用group()方法里的索引 將url,標題和日期全部給打印出來  
  12.            System.out.println("打印出url鏈接:"+m.group(1));  
  13.            System.out.println("打印出標題:"+m.group(2));   
  14.            System.out.println("打印出日期:"+m.group(3));   
  15.            System.out.println();  
  16.            }    
  17.       System.out.println("group方法捕獲的數據個數:"+m.groupCount()+ "個");  
  18.       }  

我們看下輸出結果:

打印出url鏈接:www.cnblogs.com/longwu
打印出標題:SoFlash
打印出日期:12.22.2011

group方法捕獲的數據個數:3個

想了解更多的朋友請看 JAVA 正則表達式 (超詳細)

如果之前沒有學過正則的可以看看這個 正則表達式的元字符匹配

好了 group方法介紹完了 我們來簡單的使用下 group采集某個足球網站頁面的數據

頁面鏈接:http://www.footballresults.org/league.php?all=1&league=EngPrem

首先我們讀取整個html頁面,并打印出來 代碼如下:

  1. public static void main(String[] args) {  
  2.         String strUrl = "http://www.footballresults.org/league.php?all=1&league=EngPrem";  
  3.         try {  
  4.             // 創建一個url對象來指向 該網站鏈接 括號里()裝載的是該網站鏈接的路徑  
  5.             // 更多可以看看 http://wenku.baidu.com/view/8186caf4f61fb7360b4c6547.html  
  6.             URL url = new URL(strUrl);  
  7.             // InputStreamReader 是一個輸入流讀取器 用于將讀取的字節轉換成字符  
  8.             // 更多可以看看 http://blog.sina.com.cn/s/blog_44a05959010004il.html   
  9.             InputStreamReader isr = new InputStreamReader(url.openStream(),  
  10.                     "utf-8"); // 統一使用utf-8 編碼模式  
  11.             // 使用 BufferedReader 來讀取 InputStreamReader 轉換成的字符  
  12.             BufferedReader br = new BufferedReader(isr);  
  13.             // 如果 BufferedReader 讀到的內容不為空  
  14.             while (br.readLine() != null) {  
  15.                 // 則打印出來 這里打印出來的結果 應該是整個網站的  
  16.                 System.out.println(br.readLine());  
  17.             }  
  18.             br.close(); // 讀取完成后關閉讀取器  
  19.         } catch (IOException e) {  
  20.             // 如果出錯 拋出異常  
  21.             e.printStackTrace();  
  22.         }  
  23.     } 

打印出來的結果 是整個html頁面的源代碼 (部分截圖如下)

到這里,數據已經成功采集下來了,當然 我們想要的并不是整個html源代碼,我們需要的是網頁上的比賽數據。

 

首先 我們分析下 html源代碼結構 來到http://www.footballresults.org/league.php?all=1&league=EngPrem 頁面

右鍵該頁面 點擊 ‘查看源文件’ 如圖:

 

我們來看看 其內部的html代碼結構 以及我們需要的數據

 

其對應的頁面數據

 

這時候,強大的正則表達式派上用場了, 我們需要寫幾個用來匹配我們需要數據的正則

這里需要用到 3個正則 包括 日期, 2個球隊的(主隊和客隊) 以及比賽結果的 如下

  1. String regularDate = "(\\d{1,2}\\.\\d{1,2}\\.\\d{4})"//日期正則  
  2. String regularTwoTeam = ">[^<>][^<>]*</a>"//球隊正則   
  3. String regularResult = ">(\\d{1,2}-\\d{1,2})</TD>"//比賽結果正則 

 

寫好正則 我們便可以使用該正則來獲取 我們想要得到的數據了

首先 我們寫一個GroupMethod類 用于存放regularGroup()方法

  1. import java.util.regex.Matcher;  
  2. import java.util.regex.Pattern;  
  3. public class GroupMethod {  
  4.     // 傳入2個字符串參數 一個是pattern(我們使用的正則) 另一個matcher是html源代碼  
  5.     public String regularGroup(String pattern, String matcher) {  
  6.         Pattern p = Pattern.compile(pattern, Pattern.CASE_INSENSITIVE);  
  7.         Matcher m = p.matcher(matcher);  
  8.         if (m.find()) { // 如果讀到  
  9.             return m.group();// 返回捕獲的數據  
  10.        } else {  
  11.             return ""// 否則返回一個空值  
  12.        }  
  13.     }  

然后是寫主函數代碼

對比下 html上的數據 (部分截圖-初始階段)

輸出結果(部分截圖-結束階段)

對比下 html上的數據 (部分截圖-結束階段)

好了 這樣的html數據采集就完成了 :)

當然這里只是抓取了一個頁面的內容如果感興趣,想抓去更多的頁面內容,你可以分析下該鏈接后的聯盟名。例如 league=EngPrem 通過改變league名來獲取所有聯盟的比賽數據你可以寫個接口把所有球隊的名字放進去,當然還有更智能的方法你可以寫個方法,從http://www.footballresults.org/allleagues.php 頁面獲取所有球隊的名字 然后來附加到 "http://www.footballresults.org/league.php?all=1&league=" 鏈接后面 來補齊鏈接 循環讀取各個聯盟比賽頁面的內容。

原文鏈接:http://www.cnblogs.com/longwu/archive/2011/12/24/2300110.html

【編輯推薦】

  1. 多態在 Java 和 C++ 編程語言中的實現比較
  2. 利用JavaMail API 解析MIME
  3. 詳細解析Java中抽象類和接口的區別
  4. 解讀Java環境變量配置
  5. Cinch和Sysmon發布 Java輔助開發工具
責任編輯:林師授 來源: SoFlash的博客
相關推薦

2009-06-17 15:25:59

Java學習

2009-06-08 16:49:05

Java正則表達式group

2009-07-16 14:46:48

jdbc statem

2009-02-17 09:10:01

正則表達式Java優化

2011-07-26 10:46:04

HTML 5

2023-12-29 08:24:50

.NETHTML解析庫數據抓取

2009-06-15 17:45:20

LINQ分組統計

2011-07-27 09:30:21

HTML 5

2019-07-17 15:45:47

正則表達式字符串前端

2019-08-27 09:34:29

數據科學統計機器學習

2021-06-04 11:50:07

芯片藍牙5.0數據遠程采集

2011-05-26 15:33:29

volatilejava

2023-06-28 16:43:31

OCR數據管理

2011-06-13 11:23:33

javasocket

2011-06-13 12:11:06

javasocket

2010-08-11 09:43:54

FlexHTML5

2018-05-30 08:54:00

離線存儲HTML5

2011-03-29 13:45:55

HTMLCSSjavascript

2021-07-12 07:59:06

安全 HTML 屬性

2009-04-15 10:51:59

敏捷軟件重用極限編程
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品久久久av | 亚洲 中文 欧美 日韩 在线观看 | 日本欧美在线视频 | 日韩精品一区二区在线 | 午夜激情视频在线 | 日韩免费视频 | 国产成人精品a视频 | 一级欧美日韩 | 999久久久 | 日韩欧美在线一区二区 | 欧美理论片在线 | 毛片一区二区三区 | 欧美一区免费在线观看 | 一区二区av| 精品无码久久久久久国产 | 二区在线观看 | 亚洲天堂色 | 亚洲精品一二三区 | 国产成人在线免费 | 日韩aⅴ片| 国产欧美一区二区在线观看 | 中文字幕男人的天堂 | 日韩欧美精品在线播放 | 天堂va在线观看 | 爱高潮www亚洲精品 中文字幕免费视频 | 日韩精品一区二区三区 | 毛片网站在线观看 | 亚洲一区二区三区视频免费观看 | 欧美精品1区 | 国产高清一区二区三区 | 午夜丰满寂寞少妇精品 | 91香蕉嫩草 | 特黄色毛片 | 色在线免费视频 | 日韩国产在线 | 国产一级毛片精品完整视频版 | 免费视频成人国产精品网站 | 日韩精品一区二区三区在线 | 国产传媒在线播放 | 久草久草久草 | 国产我和子的乱视频网站 |