1. 程式人生 > >C#自寫的一個HTML解析類(類似XElement語法)

C#自寫的一個HTML解析類(類似XElement語法)

功能:

1、輕鬆獲取指元素HTML元素。
2、可以根據屬性標籤進行篩選
3、返回的都是Llist強型別無需轉換

 
用過XElement的都知道 用來解析XML非常的方便,但是對於HTML的格式多樣化實在是沒辦法相容。

所以我就寫了這麼一個類似XElement的 XHTMLElement

用法:

  1. string filePath = Server.MapPath("~/file/test.htm");  
  2.       //獲取HTML程式碼
  3.       string mailBody = FileHelper.FileToString(filePath);  
  4.       XHtmlElement xh = new XHtmlElement(mailBody);  
  5.       //獲取body的子集a標籤並且class="icon"
  6.       var link = xh.Descendants("body").ChildDescendants("a").Where(c => c.Attributes.Any(a => a.Key == "class" && a.Value == "icon")).ToList();  
  7.       //獲取帶href的a元素
  8.       var links = xh.Descendants("a"
    ).Where(c => c.Attributes.Any(a => a.Key == "href")).ToList();  
  9.       foreach (var r in links)  
  10.       {  
  11.         Response.Write(r.Attributes.Single(c => c.Key == "href").Value); //出輸href
  12.       }  
  13.       //獲取第一個img
  14.       var img = xh.Descendants("img");  
  15.       //獲取最近的第一個p元素以及與他同一級的其它p元素
  16.       var ps = xh.Descendants("p");  

程式碼:

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Web;  
  5. using System.Text;  
  6. using System.Text.RegularExpressions;  
  7. namespace SyntacticSugar  
  8. {  
  9.   /// <summary>
  10.   /// ** 描述:html解析類
  11.   /// ** 創始時間:2015-4-23
  12.   /// ** 修改時間:-
  13.   /// ** 作者:sunkaixuan
  14.   /// ** qq:610262374 歡迎交流,共同提高 ,命名語法等寫的不好的地方歡迎大家的給出寶貴建議
  15.   /// </summary>
  16.   publicclass XHtmlElement  
  17.   {  
  18.     privatestring _html;  
  19.     public XHtmlElement(string html)  
  20.     {  
  21.       _html = html;  
  22.     }  
  23.     /// <summary>
  24.     /// 獲取最近的相同層級的HTML元素
  25.     /// </summary>
  26.     /// <param name="elementName">等於null為所有元素</param>
  27.     /// <returns></returns>
  28.     public List<HtmlInfo> Descendants(string elementName = null)  
  29.     {  
  30.       if (_html == null)  
  31.       {  
  32.         thrownew ArgumentNullException("html不能這空!");  
  33.       }  
  34.       var allList = RootDescendants(_html);  
  35.       var reval = allList.Where(c => elementName == null || c.TagName.ToLower() == elementName.ToLower()).ToList();  
  36.       if (reval == null || reval.Count == 0)  
  37.       {  
  38.         reval = GetDescendantsSource(allList, elementName);  
  39.       }  
  40.       return reval;  
  41.     }  
  42.     /// <summary>
  43.     /// 獲取第一級元素
  44.     /// </summary>
  45.     /// <param name="elementName"></param>
  46.     /// <returns></returns>
  47.     public List<HtmlInfo> RootDescendants(string html = null)  
  48.     {  
  49.       /* 
  50.        * 業務邏輯: 
  51.              * 1、獲取第一個html標籤一直找結尾標籤,如果在這個過程中遇到相同的標籤收尾標籤就要加1 
  52.              * 2、第一個標籤取到後繼續第一步操作,找第2個元素 。。第N個元素 
  53.        */
  54.       if (html == null) html = _html;  
  55.       var firstTag = Regex.Match(html, "<.+?>");  
  56.       List<string> eleList = new List<string>();  
  57.       List<HtmlInfo> reval = new List<HtmlInfo>();  
  58.       GetElementsStringList(html, ref eleList);  
  59.       foreach (var r in eleList)  
  60.       {  
  61.         HtmlInfo data = new HtmlInfo();  
  62.         data.OldFullHtml = r;  
  63.         data.SameLeveHtml = html;  
  64.         data.TagName = Regex.Match(r, @"(?<=\s{1}|\<)[a-z,A-Z]+(?=\>|\s)", RegexOptions.IgnoreCase).Value;  
  65.         data.InnerHtml = Regex.Match(r, @"(?<=\>).+(?=<)", RegexOptions.Singleline).Value;  
  66.         var eleBegin = Regex.Match(r, "<.+?>").Value;  
  67.         var attrList = Regex.Matches(eleBegin, @"[a-z,A-Z]+\="".+?""").Cast<Match>().Select(c => new { key = c.Value.Split('=').First(), value = c.Value.Split('=').Last().TrimEnd('"').TrimStart('"') }).ToList();  
  68.         data.Attributes = new Dictionary<stringstring>();  
  69.         if (attrList != null && attrList.Count > 0)  
  70.         {  
  71.           foreach (var a in attrList)  
  72.           {  
  73.             data.Attributes.Add(a.key, a.value);  
  74.           }  
  75.         }  
  76.         reval.Add(data);  
  77.       }  
  78.       return reval;  
  79.     }  
  80.     #region private
  81.     private List<HtmlInfo> GetDescendantsSource(List<HtmlInfo> allList, string elementName)  
  82.     {  
  83.       foreach (var r in allList)  
  84.       {  
  85.         if (r.InnerHtml == null || !r.InnerHtml.Contains("<")) continue;  
  86.         var childList = RootDescendants(r.InnerHtml).Where(c => elementName == null || c.TagName.ToLower() == elementName.ToLower()).ToList();  
  87.         if

    相關推薦

    C#一個HTML解析類似XElement語法

    功能: 1、輕鬆獲取指元素HTML元素。 2、可以根據屬性標籤進行篩選 3、返回的都是Llist強型別無需轉換   用過XElement的都知道 用來解析XML非常的方便,但是對於HTML的格式多樣化實在是沒辦法相容。 所以我就寫了這麼一個類似XElement的 XHTMLEl

    Delphi通過MSHTML實現一個HTML解析

    (******************************************************)(*                得閒工作室                          *)(*              網頁元素操作類庫                      *)

    C++ 中的字符串二十七

    C++ 字符串類 循環移動 在 C 語言中是不支持真正意義上的字符串,是用字符數組和一組函數來實現字符串操作的。同樣,在 C 語言中不支持自定義類型,因此無法獲得字符串類型。那麽從 C 到 C++ 的進化過程引入了自定義類型,在 C++ 中可以通過類來完成字符串類型的定義。那麽問題

    MFC C++程式碼與WebBrowser HTML的互動還需完善

    testWebBrowser.h // testWebBrowserDlg.h : 標頭檔案 // #pragma once #include "explorer1.h" #import "C:\windows\system32\mshtml.tlb" // loca

    php常用公共函式非系統函式,關鍵的時候用得著[thinkPHP5框架]

     本文基於thinkPHP5框架,但不限於它,需要的時候把需要的地方改成你需要的就可以用了: 例如:你的框架是CI,那麼查詢資料就不是用Db了,稍微修改即可 <?php use service\DataService; use service\NodeServic

    c++primer,定義一個復數

    opera 指針 隨著 per call 拷貝構造函數 會銷 局部變量 eal 1 #include<iostream> 2 #include<string> 3 #include<vector> 4 #include<a

    Java開源Html解析轉載

      NekoHTML  NekoHTML是一個簡單地HTML掃描器和標籤補償器(tag balancer) ,使得程式能解析HTML文件並用標準的XML介面來訪問其中的資訊。這個解析器能投掃描HTML檔案並“修正”許多作者(人或機器)

    c# 多執行緒使用佇列順序日誌的 需要再優化

    using System; using System.Collections.Generic; using System.Threading; public class LogManager { /// <summary> /// 建構函式 /// </su

    教你一個簡單的網頁html網頁開發入門

    網頁的組成 HTML  網頁的具體內容和結構 CSS  網頁的樣式(美化網頁最重要的一塊) JavaScript  網頁的互動效果,比如對使用者滑鼠事件作出響應 HTML 什麼是HTML HTML的全稱是HyperTextMarkupLanguage,超文字標

    C語言一個方便的GCC編譯工具古月

    使用的場景 我在學習C語言的時候要寫很多測試的程式碼,然而每次在編譯程式碼的時候每次都要寫同樣的編譯程式碼gcc -o 生成的檔名 原始碼檔案.c 而我們有現有的生成規則,那就是生成的檔案只要去掉原始檔後面的.c字尾即可,那我們何不寫個程式來實現這個功能呢? 下面是具體實現程式碼

    c語言 一個函式,輸入n,求斐波拉契數列的第n項5種方法,層層優化

                    寫一個函式,輸入n,求斐波拉契數列的第n項。 斐波拉契數列:1,1,2,3,5,8...,當n

    黃聰:C#類似Jquery的html解析HtmlAgilityPack基礎介紹及運用

    Html Agility Pack 原始碼中的類大概有28個左右,其實不算一個很複雜的類庫,但它的功能確不弱,為解析DOM已經提供了足夠強大的功能支援,可以跟jQuery操作DOM媲美:) 基礎類和基礎方法介紹 Html Agility Pack最常用的基礎類其實不多,對解析DOM來說,就只有

    C函式指標妙用,用c語言一個簡易

    其實在C++中的物件也並不是實現起來也並不是多麼的什麼神祕,只是編譯器幫我們做了許多工作,所以我們總覺得C++要比c語言難一些,C++編譯器其實對於類中的非Virtual 函式的的呼叫規則與對C編譯器對函式的呼叫時一樣的,那就是通過call 函式地址的方法。等有

    C語言開發一個BT下載軟體 ------ 程式碼實現-1-種子檔案解析模組

    //parse_metafile.h #ifndef PARSE_METAFILE #define PARSE_METAFILE // 儲存從種子檔案中獲取的tracker的URL typedef struct _Announce_list { char ann

    C++PE檔案格式解析輕鬆製作自己的PE檔案解析

    PE是Portable Executable File Format(可移植的執行體)簡寫,它是目前Windows平臺上的主流可執行檔案格式。 PE檔案中包含的內容很多,具體我就不在這解釋了,有興趣的可以參看之後列出的參考資料及其他相關內容。 最近我也在學習PE檔案格式,參

    定義報告,用Java一個html文件

    tst style pen found ner output ima ex18 詳細 因為testng不滿足我們的展示,所以我們會自己定義一個報告,實施步驟是,把靜態頁面做好後,放在Java項目中,其實和生成一個日誌文件類似,只是該了後綴,Java中需要使用到Pri

    怎麽使用jquery判斷一個元素是否含有一個指定的class

    () pla jquer java 例子 add red tro lan 在jQuery中可以使用2種方法來判斷一個元素是否包含一個確定的類(class)。兩種方法有著相同的功能。2種方法如下: 1. is(‘.classname’) 2.

    C#學習筆記第一發---C#基礎型和基礎語法

    問號 key 循環 自動 其中 clas tlist 不存在 邏輯運算 首先,數據類型分為值類型和引用數據類型以及指針類型(暫不涉及):值類型是指直接儲存在內存的棧上面,引用類型則在棧上儲存一個引用,在堆上儲存具體的值。 值類型分為內建類型和用戶可以自定義的struct

    C#操作MySql數據庫幫助Dapper,T-Sql

    user lex object per ram int rowfilter close tex using System.Text; using MySql.Data.MySqlClient; using System.Data; using Dapper; using

    C語言一個好玩的寶石一樣的圖像

    循環圖像圖形#include<stdio.h>main(){int n;scanf("%d",&n); for(int i=0;i<n;i++) { for(int j=0;j<n-i-1;j++) { printf(" ")