1. 程式人生 > >抓取並解析網頁資料(xml解析、html解析)

抓取並解析網頁資料(xml解析、html解析)

網頁有兩種格式,一種是xml另一種是html,目前似乎好像大部分都是html格式的,檢視網頁格式的方法是在瀏覽器中右鍵–>檢視原始碼或者直接F12即可。

一、XML解析

1)DOM解析

DOM(Document Object Mode)是將XML檔案的所有內容以文件樹的方式存在記憶體中,通過節點以及節點之間的關係來解析XML檔案。由於DOM操作會將整個XML檔案存放在記憶體中,所以消耗記憶體大,較大的文件不採用這種方法解析。

2)SAX解析

SAX解析,逐行掃描XML文件,遇到標籤時觸發姐系處理器,採用事件處理的方式解析XML,在讀取文件的同時即可對XML進行處理。可以解析超大XML,但是SAX解析只能讀取XML中的資料,無法對資料進行增刪改

3)PULL解析

PULL解析器是一個開源Java專案,既可用於Android應用也可用於JavaEE程式。Android中集成了PULL解析器,因此,Android中常用的就是PULL解析
此處提供一個xml地址:http://bbs.csdn.net/recommend_tech_topics.atom

使用案例:

此處使用pull解析的方式

需要解析的xml:

 <entry>
    <id>http://bbs.csdn.net/topics/392114349</id>
    <published>2017-03-08T15:51:57+08:00</published
>
<updated>2017-12-19T15:04:26+08:00</updated> <link rel="alternate" type="text/html" href="http://bbs.csdn.net/topics/392114349"/> <title>dubbo下如何使用hibernate的級聯操作</title> <summary>dubbo下如何使用hibernate的級聯操作</summary> <author>a461666405</author
>
</entry> <!--部分程式碼,具體點選上面連結 -->

根據xml內容分類建立實體類即可。

新建一個XMLSerivce工具類用來解析xml

public class XMLService {
    // 返回資訊集合
    public static List<Bean> getNewsInfo(InputStream is) throws Exception {
        XmlPullParser parser = Xml.newPullParser(); // 獲取Pull解析器
        parser.setInput(is, "utf-8");
        List<Bean> list = null;
        Bean bean = null;

        // 得到當前事件的型別
        int type = parser.getEventType();

        while (type != XmlPullParser.END_DOCUMENT) {

            switch (type) {
                // XML文件的開始START_DOCUMENT 例如:<?xml version="1.0" encoding="UTF-8"?> 0
                case XmlPullParser.START_DOCUMENT:
                    list = new ArrayList<>();
                    break;
                // XML文件節點開始START_TAG 例如:<entry> 2
                case XmlPullParser.START_TAG:
                    bean = new Bean();
                    if ("entry".equals(parser.getName())) {
                        Log.e("XML", "<ebtry>");


                    } else if ("id".equals(parser.getName())) {
                        String path = parser.nextText();
                        bean.setPath(path);
                        Log.e("XML", "path == " + path + "parse == " + parser.getName());

                    } else if ("published".equals(parser.getName())) {
                        String published = parser.nextText();
                        bean.setPublised(published);
                        Log.e("XML", "published == " + published + "parse == " + parser.getName());

                    } else if ("updated".equals(parser.getName())) {
                        String updtaed = parser.nextText();
                        bean.setUpdated(updtaed);
                        Log.e("XML", "updated == " + updtaed + "parse == " + parser.getName());

                    } else if ("title".equals(parser.getName())) {
                        String title = parser.nextText();
                        bean.setTitle(title);
                        Log.e("XML", "title == " + title + "parse == " + parser.getName());

                    } else if ("summary".equals(parser.getName())) {
                        String summary = parser.nextText();
                        bean.setUpdated(summary);
                        Log.e("XML", "summary == " + summary + "parse == " + parser.getName());

                    } else if ("author".equals(parser.getName())) {
                        String author = parser.nextText();
                        bean.setUpdated(author);
                        Log.e("XML", "author == " + author + "parse == " + parser.getName());

                    }
                    break;
                // XML文件的結束節點 如</entry> 3
                case XmlPullParser.END_TAG:

                    if ("entry".equals(parser.getName())) {
                        Log.e("XML", "解析xml一個節點完成" + parser.getName());

                        // 處理完一個entry標籤
                        list.add(bean);
                        bean = null;
                    }
                    break;
            }
            type = parser.next(); // 解析下一個節點
        }
        return list;
    }
}

在Activity中,

private void pullParseXml(){

        final Message message = new Message();
        beanList = new ArrayList<>();

        new Thread(new Runnable() {
            @Override
            public void run() {

                try {
                    URL url = new URL("http://bbs.csdn.net/recommend_tech_topics.atom");
                    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                    conn.setRequestMethod("GET");
                    conn.setConnectTimeout(5000);
                    int code = conn.getResponseCode();
                    if (code == 200){
                        Log.e("XML","請求成功");
                        InputStream is = conn.getInputStream();
                        beanList = XMLService.getNewsInfo(is);
                        Log.e("XML",beanList.size()+ "");

                        // 成功獲取資料 給主執行緒發訊息
                        message.what = 3;
                        handler.sendMessage(message);
                    }

                } catch (Exception e) {
                    // 獲取資料失敗,給主執行緒發訊息,處理資料
                    message.what = 4;
                    handler.sendMessage(message);

                    e.printStackTrace();
                }

            }
        }).start();

    }

得到的資料:
pull解析xml

二、Html解析

資料來源來自虎撲體育

虎撲體育原始碼

1)Jsoup

Jsoup 是一款 Java 的 HTML 解析器,可直接解析某個 URL 地址、HTML 文字內容。它提供了一套非常省力的 API,可通過 DOM,CSS 以及類似於 jQuery 的操作方法來取出和操作資料。

Jsoup的主要功能:
1. 從一個 URL,檔案或字串中解析 HTML;
2. 使用 DOM 或 CSS 選擇器來查詢、取出資料;
3. 可操作 HTML 元素、屬性、文字;

——註釋寫在程式碼裡—–

使用前需要匯入Jsoup的jar包,複製jar包AndroidStudio中lib目錄下並右鍵Add As Library。點選下載

使用案例

 private void getDataByJsoup(){

        final NewsInfo newsInfo = new NewsInfo();
        final Message message = new Message();
        newsList.add(newsInfo);

        // 開啟一個新執行緒
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    // 網路載入HTML文件
                    Document doc = Jsoup.connect("https://voice.hupu.com/nba")
                            .timeout(5000) // 設定超時時間
                            .get(); // 使用GET方法訪問URL
                    Elements elements = doc.select("div.list-hd");
                    for (Element element:elements){

                        String title = element.select("a").text(); // 新聞標題
                        String url = element.select("a").attr("href"); // 新聞內容連結
                        newsInfo.setTitle(title);
                        newsInfo.setNewsUrl(url);
                        Log.e("TAG","Jsoup ======>>" + title + url);
                    }
                    Elements elements1 = doc.select("div.otherInfo");
                    for (Element element: elements1){

                        String time = element.select("a").text(); // 時間
                        newsInfo.setNewsTime(time);
                        Log.e("TAG","Jsoup ======>>" + time );

                    }

                    message.what = 1;

                } catch (IOException e) {
                    message.what = 2;
                    e.printStackTrace();
                }
                handler.sendMessage(message);

            }
        }).start();

    }

獲取的資料:

Jsoup獲取的資料

相關推薦

解析網頁資料xml解析html解析

網頁有兩種格式,一種是xml另一種是html,目前似乎好像大部分都是html格式的,檢視網頁格式的方法是在瀏覽器中右鍵–>檢視原始碼或者直接F12即可。 一、XML解析 1)DOM解析 DOM(Document Object Mode)是

網路爬蟲中FiddlerPC端網頁資料包與手機端APP資料

1 引言   在編寫網路爬蟲時,第一步(也是極為關鍵一步)就是對網路的請求(request)和回覆(response)進行分析,尋找其中的規律,然後才能通過網路爬蟲進行模擬。瀏覽器大多也自帶有除錯工具可以進行抓包分析,但是瀏覽器自帶的工具比較輕量,複雜的抓包並不支援。且有時候需要編寫手機APP爬

網頁資料之讀取網頁資料

最近專案中需要用到各大網站的資料,這裡沒用爬蟲,用純java程式碼,無任何外掛,抓取一些自己需要的資料! 後續會記錄主要的幾個網站資料抓取,主要針對帶單個搜尋框的網站!下面是一個公用的讀取網頁資料操作

Java從網路中請求獲取JSon資料以及解析JSON資料----自創,請註明

 Json資料是比較常用的資料型別解析,優點就不多說啦。來看看方法: public static JSONObject getJsonObject(String url) { JSONObjec

微信小程式聯盟:微信小程式之獲取解密使用者資料獲取openIdunionId

前言在實際的小程式開發中,往往需要使用者授權登陸並獲取使用者的資料,快速對接使用者系統。openId : 使用者在當前小程式的唯一標識 unionId : 如果開發者擁有多個移動應用、網站應用、和公眾帳號(包括小程式),可通過unionid來區分使用者的唯一性,因為只要是同一

JAVA微信小程式之獲取解密使用者資料獲取openIdunionId

前言在實際的小程式開發中,往往需要使用者授權登陸並獲取使用者的資料,快速對接使用者系統。openId : 使用者在當前小程式的唯一標識unionId : 如果開發者擁有多個移動應用、網站應用、和公眾帳號(包括小程式),可通過unionid來區分使用者的唯一性,因為只要是同一個微信開放平臺帳號下的移動應用、網站

java工具類之Excel檔案匯入讀取資料支援xls和xlsx

所需的jar包:poi的jar包儘量保持一致,不然會報版本不一致的錯誤下面是程式碼:package ReadExcel; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.

androidstudio怎麼使用DDMS檢視DATABASE資料最權威親自實踐

    遇到問題,我們的第一個想法是上網尋找答案,可是,面對眾多層次不齊的文章,我們到底能夠有多大的耐心呢?    通過這三張圖片,我想資料是匯出來了。具體怎麼做呢:  資料庫的檢視工具有很多,我這裡用了sqlitestudio和sqlite expert professio

1lib7z-Memory從記憶體或網路解壓資料編譯原始碼前期準備

7z的壓縮率高,想用它從記憶體或網路請求到的資料中解壓資料到磁碟,這樣就不用再把資料生成.7z檔案在磁碟上,省去了耗時的IO操作,也節省了磁碟資源和時間。用這個技術去實現自己的安裝包也是可以的(把.7z檔案放進exe檔案中,再用這個方法把7z解壓到磁碟上)。想實現這個目的,

機器學習基礎三十六—— 非規整資料值缺失異常值的處理

(1)非規整 (2)值缺失 (3)異常值(outlier) 一般來說,現實中的資料會存在資訊不完整、資料點缺失和異常值的情況,理想情況下,我們會去嘗試修復非規整資料,但很多資料集都源於一些難以重現

android 使用epublib開源框架解析epub檔案章節內容書籍選單

前期準備 jsoup(可以可把html標籤,解析為物件): 進入正題 如果你是吧 .equb 格式的檔案放到 assets 檔案下,你可以這樣獲取book物件。 MainActivity.java import android.cont

使用java開源工具httpClient及jsoup解析網頁資料

  今天做專案的時候遇到這樣一個需求,需要在網頁上展示今日黃曆資訊,資料格式如下   公曆時間:2016年04月11日 星期一  農曆時間:猴年三月初五  天干地支:丙申年 壬辰月 癸亥日  宜:求子 祈福 開光 祭祀 安床  忌:玉堂(黃道)危日,忌出行  主要包括公曆/農曆日期,以及忌宜資訊的等。但是手

Java網頁資料網頁+Javascript返回資料

轉載請註明出處! 有時候由於種種原因,我們需要採集某個網站的資料,但由於不同網站對資料的顯示方式略有不同! 本文就用Java給大家演示如何抓取網站的資料:(1)抓取原網頁資料;(2)抓取網頁Jav

node.js 小爬蟲網頁資料2

node.js 小爬蟲抓取網頁資料 在原來的基礎上,採用了promise的模組,使其可以一次性多頁面的爬取網頁資料。 var http = require('http') var Promise = require('promise') var cheerio = re

Python實例之淘寶商品數據json型數據保存為TXT

sel range ats 表達 隨著 request nic rom .get 本實例實現了抓取淘寶網中以‘python’為關鍵字的搜索結果,經詳細查看數據存儲於html文檔中的js腳本中,數據類型為JSON 通過瀏覽器相關工具發現捧腹網笑話頁面的數據存儲在HTML頁面而

Python爬蟲實戰:儲存百度雲資源附程式碼

尋找並分析百度雲的轉存api 首先你得有一個百度雲盤的賬號,然後登入,用瀏覽器(這裡用火狐瀏覽器做示範)開啟一個分享連結。F12開啟控制檯進行抓包。手動進行轉存操作:全選檔案->儲存到網盤->選擇路徑->確定。點選【確定】前建議先清空一下抓包記錄,這樣可以精確定位到轉存的api,這就是

利用神州靈雲AppTrace到的APP資料反向給做Jmeter介面測試

用jmeter模擬登入月光茶人APP選購支付流程(或者大量併發,實現壓測效果) 現實中APP對登入都有限制,同一賬號只能同時登入一次,且手裡沒有多餘的賬號如何進行併發測試呢,這個時候只需單獨對登入http請求進行控制即可;其他請求操作可以放在一塊進行併發測試;

python爬蟲爬非同步載入網頁資訊python網頁中無法通過網頁標籤屬性的內容

1.問題描述 最近由於學習內容的要求,需要從網頁上抓取一些資料來做分析報告,在看了python爬蟲的一些基礎知識之後就直接上手去網站上爬資料了。作為新手踩坑是無法避免,最近就遇到了一個比較難的問題: 一般情況下,要抓去網頁上某個標籤上的內容,在通過urllib下

自動解析一個商品頁

以美國adidas官網為例。 輸入url,抓取商品資訊(標題、描述、圖片等);抓取屬性資訊(顏色、尺碼、價格、庫存、skuId)。 思路很簡單,就是開啟頁面,分析各個需要內容的標籤。 獲取頁面 public static Document get

新浪微博爬蟲分享一天可 1300 萬條資料

爬蟲功能: 此專案和QQ空間爬蟲類似,主要爬取新浪微博使用者的個人資訊、微博資訊、粉絲和關注(詳細見此)。 程式碼獲取新浪微博Cookie進行登入,可通過多賬號登入來防止新浪的反扒(用來登入的賬號可從淘寶購買,一塊錢七個)。 專案爬的是新浪微