C#自寫的一個HTML解析類(類似XElement語法)
功能:
1、輕鬆獲取指元素HTML元素。
2、可以根據屬性標籤進行篩選
3、返回的都是Llist強型別無需轉換
用過XElement的都知道 用來解析XML非常的方便,但是對於HTML的格式多樣化實在是沒辦法相容。
所以我就寫了這麼一個類似XElement的 XHTMLElement
用法:
- string filePath = Server.MapPath("~/file/test.htm");
- //獲取HTML程式碼
-
string mailBody = FileHelper.FileToString(filePath);
- XHtmlElement xh = new XHtmlElement(mailBody);
- //獲取body的子集a標籤並且class="icon"
- var link = xh.Descendants("body").ChildDescendants("a").Where(c => c.Attributes.Any(a => a.Key == "class" && a.Value == "icon")).ToList();
- //獲取帶href的a元素
-
var links = xh.Descendants("a"
- foreach (var r in links)
- {
- Response.Write(r.Attributes.Single(c => c.Key == "href").Value); //出輸href
- }
- //獲取第一個img
- var img = xh.Descendants("img");
-
//獲取最近的第一個p元素以及與他同一級的其它p元素
- var ps = xh.Descendants("p");
程式碼:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Web;
- using System.Text;
- using System.Text.RegularExpressions;
- namespace SyntacticSugar
- {
- /// <summary>
- /// ** 描述:html解析類
- /// ** 創始時間:2015-4-23
- /// ** 修改時間:-
- /// ** 作者:sunkaixuan
- /// ** qq:610262374 歡迎交流,共同提高 ,命名語法等寫的不好的地方歡迎大家的給出寶貴建議
- /// </summary>
- publicclass XHtmlElement
- {
- privatestring _html;
- public XHtmlElement(string html)
- {
- _html = html;
- }
- /// <summary>
- /// 獲取最近的相同層級的HTML元素
- /// </summary>
- /// <param name="elementName">等於null為所有元素</param>
- /// <returns></returns>
- public List<HtmlInfo> Descendants(string elementName = null)
- {
- if (_html == null)
- {
- thrownew ArgumentNullException("html不能這空!");
- }
- var allList = RootDescendants(_html);
- var reval = allList.Where(c => elementName == null || c.TagName.ToLower() == elementName.ToLower()).ToList();
- if (reval == null || reval.Count == 0)
- {
- reval = GetDescendantsSource(allList, elementName);
- }
- return reval;
- }
- /// <summary>
- /// 獲取第一級元素
- /// </summary>
- /// <param name="elementName"></param>
- /// <returns></returns>
- public List<HtmlInfo> RootDescendants(string html = null)
- {
- /*
- * 業務邏輯:
- * 1、獲取第一個html標籤一直找結尾標籤,如果在這個過程中遇到相同的標籤收尾標籤就要加1
- * 2、第一個標籤取到後繼續第一步操作,找第2個元素 。。第N個元素
- */
- if (html == null) html = _html;
- var firstTag = Regex.Match(html, "<.+?>");
- List<string> eleList = new List<string>();
- List<HtmlInfo> reval = new List<HtmlInfo>();
- GetElementsStringList(html, ref eleList);
- foreach (var r in eleList)
- {
- HtmlInfo data = new HtmlInfo();
- data.OldFullHtml = r;
- data.SameLeveHtml = html;
- data.TagName = Regex.Match(r, @"(?<=\s{1}|\<)[a-z,A-Z]+(?=\>|\s)", RegexOptions.IgnoreCase).Value;
- data.InnerHtml = Regex.Match(r, @"(?<=\>).+(?=<)", RegexOptions.Singleline).Value;
- var eleBegin = Regex.Match(r, "<.+?>").Value;
- 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();
- data.Attributes = new Dictionary<string, string>();
- if (attrList != null && attrList.Count > 0)
- {
- foreach (var a in attrList)
- {
- data.Attributes.Add(a.key, a.value);
- }
- }
- reval.Add(data);
- }
- return reval;
- }
- #region private
- private List<HtmlInfo> GetDescendantsSource(List<HtmlInfo> allList, string elementName)
- {
- foreach (var r in allList)
- {
- if (r.InnerHtml == null || !r.InnerHtml.Contains("<")) continue;
- var childList = RootDescendants(r.InnerHtml).Where(c => elementName == null || c.TagName.ToLower() == elementName.ToLower()).ToList();
-
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(" ")