C#解析HTML

第一种方法:用正则表达式来分析

[csharp] view plaincopy
  1. 转自网上的一个实例:所有的href都抽取出来:  
  2. using System;  
  3. using System.Net;  
  4. using System.Text;  
  5. using System.Text.RegularExpressions;  
  6. namespace HttpGet  
  7. {  
  8.     class Class1  
  9.     {  
  10.         [STAThread]  
  11.         static void Main(string[] args)  
  12.         {  
  13.             System.Net.WebClient client = new WebClient();  
  14.             byte[] page = client.DownloadData("http://www.google.com");  
  15.             string content = System.Text.Encoding.UTF8.GetString(page);  
  16.             string regex = "href=[\\\"\\\'](http:\\/\\/|\\.\\/|\\/)?\\w+(\\.\\w+)*(\\/\\w+(\\.\\w+)?)*(\\/|\\?\\w*=\\w*(&\\w*=\\w*)*)?[\\\"\\\']";  
  17.             Regex re = new Regex(regex);  
  18.             MatchCollection matches = re.Matches(content);  
  19.   
  20.             System.Collections.IEnumerator enu = matches.GetEnumerator();  
  21.             while (enu.MoveNext() && enu.Current != null)  
  22.             {  
  23.                 Match match = (Match)(enu.Current);  
  24.                 Console.Write(match.Value + "\r\n");  
  25.             }  
  26.         }  
  27.     }  
  28. }  
  29.   
  30. 一些爬虫的HTML解析中也是用的类似的方法。  


第二中方法: 利用Winista.Htmlparser.Net 解析Html

1.  下载:

http://www.netomatix.com/Products/DocumentManagement/HTMLParserNet.aspx

2. 使用实例1

[csharp] view plaincopy
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.ComponentModel;  
  4. using System.Data;  
  5. using System.Drawing;  
  6. using System.Linq;  
  7. using System.Text;  
  8. using System.Windows.Forms;  
  9. using Winista.Text.HtmlParser;  
  10. using Winista.Text.HtmlParser.Lex;  
  11. using Winista.Text.HtmlParser.Util;  
  12. using Winista.Text.HtmlParser.Tags;  
  13. using Winista.Text.HtmlParser.Filters;  
  14.   
  15.   
  16. namespace HTMLParser  
  17. {  
  18.     public partial class Form1 : Form  
  19.     {  
  20.         public Form1()  
  21.         {  
  22.             InitializeComponent();  
  23.             AddUrl();  
  24.         }  
  25.   
  26.         private void btnParser_Click(object sender, EventArgs e)  
  27.         {  
  28.             #region 获得网页的html  
  29.             try  
  30.             {  
  31.   
  32.                 txtHtmlWhole.Text = "";  
  33.                 string url = CBUrl.SelectedItem.ToString().Trim();  
  34.                 System.Net.WebClient aWebClient = new System.Net.WebClient();  
  35.                 aWebClient.Encoding = System.Text.Encoding.Default;  
  36.                 string html = aWebClient.DownloadString(url);  
  37.                 txtHtmlWhole.Text = html;  
  38.             }  
  39.             catch (Exception ex)  
  40.             {  
  41.                 MessageBox.Show(ex.Message);  
  42.             }  
  43.             #endregion  
  44.  
  45.             #region 分析网页html节点  
  46.             Lexer lexer = new Lexer(this.txtHtmlWhole.Text);  
  47.             Parser parser = new Parser(lexer);  
  48.             NodeList htmlNodes = parser.Parse(null);  
  49.             this.treeView1.Nodes.Clear();  
  50.             this.treeView1.Nodes.Add("root");  
  51.             TreeNode treeRoot = this.treeView1.Nodes[0];  
  52.             for (int i = 0; i < htmlNodes.Count; i++)  
  53.             {  
  54.                 this.RecursionHtmlNode(treeRoot, htmlNodes[i], false);  
  55.             }  
  56.  
  57.             #endregion  
  58.   
  59.         }  
  60.   
  61.         private void RecursionHtmlNode(TreeNode treeNode, INode htmlNode, bool siblingRequired)  
  62.         {  
  63.             if (htmlNode == null || treeNode == nullreturn;  
  64.   
  65.             TreeNode current = treeNode;  
  66.             TreeNode content ;  
  67.             //current node  
  68.             if (htmlNode is ITag)  
  69.             {  
  70.                 ITag tag = (htmlNode as ITag);  
  71.                 if (!tag.IsEndTag())  
  72.                 {  
  73.                     string nodeString = tag.TagName;  
  74.                     if (tag.Attributes != null && tag.Attributes.Count > 0)  
  75.                     {  
  76.                         if (tag.Attributes["ID"] != null)  
  77.                         {  
  78.                             nodeString = nodeString + " { id=\"" + tag.Attributes["ID"].ToString() + "\" }";  
  79.                         }  
  80.                         if (tag.Attributes["HREF"] != null)  
  81.                         {  
  82.                             nodeString = nodeString + " { href=\"" + tag.Attributes["HREF"].ToString() + "\" }";  
  83.                         }  
  84.                     }  
  85.                       
  86.                     current = new TreeNode(nodeString);  
  87.                     treeNode.Nodes.Add(current);  
  88.                 }  
  89.             }  
  90.   
  91.             //获取节点间的内容  
  92.             if (htmlNode.Children != null && htmlNode.Children.Count > 0)  
  93.             {  
  94.                 this.RecursionHtmlNode(current, htmlNode.FirstChild, true);  
  95.                 content = new TreeNode(htmlNode.FirstChild.GetText());  
  96.                 treeNode.Nodes.Add(content);  
  97.             }  
  98.   
  99.             //the sibling nodes  
  100.             if (siblingRequired)  
  101.             {  
  102.                 INode sibling = htmlNode.NextSibling;  
  103.                 while (sibling != null)  
  104.                 {  
  105.                     this.RecursionHtmlNode(treeNode, sibling, false);  
  106.                     sibling = sibling.NextSibling;  
  107.                 }  
  108.             }  
  109.         }  
  110.         private void AddUrl()  
  111.         {  
  112.             CBUrl.Items.Add("http://www.hao123.com");  
  113.             CBUrl.Items.Add("http://www.sina.com");  
  114.             CBUrl.Items.Add("http://www.heuet.edu.cn");  
  115.         }  
  116.   
  117.           
  118.   
  119.     }  
  120. }  

运行效果:
实现取来很容易,结合Winista.Htmlparser源码很快就可以实现想要的效果。

3. 使用实例2

[csharp] view plaincopy
  1. using Winista.Text.HtmlParser;  
  2.   
  3. using Winista.Text.HtmlParser.Tags;  
  4.   
  5. using Winista.Text.HtmlParser.Filters;  
  6.   
  7. using Winista.Text.HtmlParser.Util;  
  8.   
  9.             string str = "<table><tr><td>姓名</td><td>林肯</td></tr><tr><td>年龄</td><td>28</td></tr><tr><td>性别</td><td>男</td></tr><tr><td>姓名</td><td>克林顿</td></tr><tr><td>年龄</td><td>38</td></tr><tr><td>性别</td><td>男</td></tr></table>";  
  10.   
  11.             Parser parser = Parser.CreateParser( str , null );  
  12.   
  13.             NodeList nodes = parser.ExtractAllNodesThatMatch( new TagNameFilter("td") );  
  14.   
  15.             this.Page.Response.Write("<b>原来的html:</b>" + str  );  
  16.   
  17.             this.Page.Response.Write("<b>转换后的html:</b><br>" );  
  18.   
  19.             forint i = 5 ; i >= 0 ; i-- )  
  20.   
  21.             {  
  22.   
  23.                 this.Page.Response.Write( nodes[i*2].FirstChild.ToHtml() + nodes[i*2+1].FirstChild.GetText() + "<br>" );  
  24.   
  25.             }  


运行结果如下:

原来的html:

姓名林肯
年龄28
性别
姓名克林顿
年龄38
性别
转换后的html:

性别男

年龄38

姓名克林顿

性别男

年龄28

姓名林肯

0

0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/388171.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

com编程创建快捷方式中文_如何以编程方式为博客创建wordcloud?

com编程创建快捷方式中文Recently, I was in need of an image for our blog and wanted it to have some wow effect or at least a better fit than anything typical we’ve been using. Pondering over ideas for a while, word cloud flashed in my mind. &#x1f4a1;Us…

ETL技术入门之ETL初认识

ETL技术入门之ETL初认识 分类&#xff1a; etl2014-07-10 23:11 3021人阅读 评论(2) 收藏 举报数据仓库商业价值etlbi目录(?)[-] ETL是什么先说下背景知识下面给下ETL的详细解释定义现在来看下kettle的transformation文件一个最简单的E过程例子windows环境 上图左边的是打开表…

ActiveSupport::Concern 和 gem 'name_of_person'(300✨) 的内部运行机制分析

理解ActiveRecord::Concern&#xff1a; 参考:include和extend的区别&#xff1a; https://www.cnblogs.com/chentianwei/p/9408963.html 传统的模块看起来像&#xff1a; module Mdef self.included(base)# base(一个类)扩展了一个模块"ClassMethods"&#xff0c; b…

Python 3.8.0a2 发布,面向对象编程语言

百度智能云 云生态狂欢季 热门云产品1折起>>> Python 3.8.0a2 发布了&#xff0c;这是 3.8 系列计划中 4 个 alpha 版本的第 2 个。 alpha 版本旨在更加易于测试新功能和 bug 修复状态&#xff0c;以及发布流程。在 alpha 阶段会添加新功能&#xff0c;直到 beta 阶…

基于plotly数据可视化_如何使用Plotly进行数据可视化

基于plotly数据可视化The amount of data in the world is growing every second. From sending a text to clicking a link, you are creating data points for companies to use. Insights that can be drawn from this collection of data can be extremely valuable. Every…

ESLint简介

ESLint简介 ESLint是一个用来识别 ECMAScript 并且按照规则给出报告的代码检测工具&#xff0c;使用它可以避免低级错误和统一代码的风格。如果每次在代码提交之前都进行一次eslint代码检查&#xff0c;就不会因为某个字段未定义为undefined或null这样的错误而导致服务崩溃&…

数据科学与大数据是什么意思_什么是数据科学?

数据科学与大数据是什么意思Data Science is an interdisciplinary field that uses a combination of code, statistical analysis, and algorithms to gain insights from structured and unstructured data.数据科学是一个跨学科领域&#xff0c;它结合使用代码&#xff0c;…

C#制作、打包、签名、发布Activex全过程

一、前言 最近有这样一个需求&#xff0c;需要在网页上面启动客户端的软件&#xff0c;软件之间的通信、调用&#xff0c;单单依靠HTML是无法实现了&#xff0c;因此必须借用Activex来实现。由于本人主要擅长C#&#xff0c;自然本文给出了用C#实现的范例&#xff0c;本文的预期…

用Python创建漂亮的交互式可视化效果

Plotly is an interactive Python library that provides a wide range of visualisations accessible through a simple interface.Plotly是一个交互式Python库&#xff0c;通过简单的界面即可提供广泛的可视化效果。 There are many different visualisation libraries avai…

Hadoop 2.0集群配置详细教程

Hadoop 2.0集群配置详细教程 前言 Hadoop2.0介绍 Hadoop是 apache 的开源 项目&#xff0c;开发的主要目的是为了构建可靠&#xff0c;可拓展 scalable &#xff0c;分布式的系 统&#xff0c; hadoop 是一系列的子工程的 总和&#xff0c;其中包含 1. hadoop common &#xff…

php如何减缓gc_管理信息传播-使用数据科学减缓错误信息的传播

php如何减缓gcWith more people now than ever relying on social media to stay updated on current events, there is an ethical responsibility for hosting companies to defend against false information. Disinformation, which is a type of misinformation that is i…

[UE4]删除UI:Remove from Parent

同时要将保存UI的变量清空&#xff0c;以释放占用的系统内存 转载于:https://www.cnblogs.com/timy/p/9842206.html

BZOJ2503: 相框

Description P大的基础电路实验课是一个无聊至极的课。每次实验&#xff0c;T君总是提前完成&#xff0c;管理员却不让T君离开&#xff0c;T君只能干坐在那儿无所事事。先说说这个实验课&#xff0c;无非就是把几根导线和某些元器件&#xff08;电阻、电容、电感等&#xff09;…

泰坦尼克号 数据分析_第1部分:泰坦尼克号-数据分析基础

泰坦尼克号 数据分析My goal was to get a better understanding of how to work with tabular data so I challenged myself and started with the Titanic -project. I think this was an excellent way to learn the basics of data analysis with python.我的目标是更好地了…

vba数组dim_NDArray — —一个基于Java的N-Dim数组工具包

vba数组dim介绍 (Introduction) Within many development languages, there is a popular paradigm of using N-Dimensional arrays. They allow you to write numerical code that would otherwise require many levels of nested loops in only a few simple operations. Bec…

关于position的四个标签

四个标签是static&#xff0c;relative&#xff0c;absolute&#xff0c;fixed。 static 该值是正常流&#xff0c;并且是默认值&#xff0c;因此你很少看到&#xff08;如果存在的话&#xff09;指定该值。 relative&#xff1a;框的位置能够相对于它在正常流中的位置有所偏移…

python算法和数据结构_Python中的数据结构和算法

python算法和数据结构To至 Leonardo da Vinci达芬奇(Leonardo da Vinci) 介绍 (Introduction) The purpose of this article is to give you a panorama of data structures and algorithms in Python. This topic is very important for a Data Scientist in order to help …

CSS:元素塌陷问题

2019独角兽企业重金招聘Python工程师标准>>> 描述&#xff1a; 在文档流中&#xff0c;父元素的高度默认是被子元素撑开的&#xff0c;也就是子元素多高&#xff0c;父元素就多高。但是当子元素设置浮动之后&#xff0c;子元素会完全脱离文档流&#xff0c;此时将会…

Celery介绍及常见错误

celery 情景&#xff1a;用户发起request&#xff0c;并等待response返回。在本些views中&#xff0c;可能需要执行一段耗时的程序&#xff0c;那么用户就会等待很长时间&#xff0c;造成不好的用户体验&#xff0c;比如发送邮件、手机验证码等。 使用celery后&#xff0c;情况…

python dash_Dash是Databricks Spark后端的理想基于Python的前端

python dash&#x1f4cc; Learn how to deliver AI for Big Data using Dash & Databricks this recorded webinar with Peter Kim of Plotly and Prasad Kona of Databricks.this通过Plotly的Peter Kim和Databricks的Prasad Kona的网络研讨会了解如何使用Dash&#xff06…