黑马程序员技术交流社区

标题: C#下解析HTML的两种方法介绍 [打印本页]

作者: 蒋元龙    时间: 2013-9-22 16:56
标题: C#下解析HTML的两种方法介绍
用System.Net.WebClient下载Web Page存到本地文件或者String中,用正则表达式来分析。这个方法可以用在Web Crawler等需要分析很多Web Page的应用中
在搜索引擎的开发中,我们需要对Html进行解析。本文介绍C#解析HTML的两种方法。AD: 在搜索引擎的开发中,我们需要对网页的Html内容进行检索,难免的就需要对Html进行解析。拆分每一个节点并且获取节点间的内容。此文介绍两种C#解析Html的方法。
C#解析Html的第一种方法:用System.Net.WebClient下载Web Page存到本地文件或者String中,用正则表达式来分析。这个方法可以用在Web Crawler等需要分析很多Web Page的应用中。估计这也是大家最直接,最容易想到的一个方法。转自网上的一个实例:所有的href都抽取出来:

  1. using System;
  2. using System.Net;
  3. using System.Text;
  4. using System.Text.RegularExpressions;
  5. namespace HttpGet
  6. {
  7. class Class1
  8. {
  9. [STAThread]
  10. static void Main(string[] args)
  11. {
  12. System.Net.WebClient client = new WebClient();
  13. byte[] page = client.DownloadData("http://www.google.com");
  14. string content = System.Text.Encoding.UTF8.GetString(page);
  15. string regex = "href=[\\\"\\\'](http:\\/\\/|\\.\\/|\\/)?\\w+(\\.\\w+)*(\\/\\w+(\\.\\w+)?)*(\\/|\\?\\w*=\\w*(&\\w*=\\w*)*)?[\\\"\\\']";
  16. Regex re = new Regex(regex);
  17. MatchCollection matches = re.Matches(content);
  18. System.Collections.IEnumerator enu = matches.GetEnumerator();
  19. while (enu.MoveNext() && enu.Current != null)
  20. {
  21. Match match = (Match)(enu.Current);
  22. Console.Write(match.Value + "\r\n");
  23. }
  24. }
  25. }
  26. }
复制代码
C#解析Html的第二种方法:利用Winista.Htmlparser.Net 解析Html。这是.NET平台下解析Html的开源代码,网上有源码下载,百度一下就能搜到,这里就不提供了。并且有英文的帮助文档。找不到的留下邮箱。
个人认为这是.net平台下解析html不错的解决方案,基本上能够满足我们对html的解析工作。自己做了个实例:

  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. namespace HTMLParser
  15. {
  16. public partial class Form1 : Form
  17. {
  18. public Form1()
  19. {
  20. InitializeComponent();
  21. AddUrl();
  22. }
  23. private void btnParser_Click(object sender, EventArgs e)
  24. {
  25. #region 获得网页的html
  26. try
  27. {
  28. txtHtmlWhole.Text = "";
  29. string url = CBUrl.SelectedItem.ToString().Trim();
  30. System.Net.WebClient aWebClient = new System.Net.WebClient();
  31. aWebClient.Encoding = System.Text.Encoding.Default;
  32. string html = aWebClient.DownloadString(url);
  33. txtHtmlWhole.Text = html;
  34. }
  35. catch (Exception ex)
  36. {
  37. MessageBox.Show(ex.Message);
  38. }
  39. #endregion
  40. #region 分析网页html节点
  41. Lexer lexer = new Lexer(this.txtHtmlWhole.Text);
  42. Parser parser = new Parser(lexer);
  43. NodeList htmlNodes = parser.Parse(null);
  44. this.treeView1.Nodes.Clear();
  45. this.treeView1.Nodes.Add("root");
  46. TreeNode treeRoot = this.treeView1.Nodes[0];
  47. for (int i = 0; i < htmlNodes.Count; i++)
  48. {
  49. this.RecursionHtmlNode(treeRoot, htmlNodes[i], false);
  50. }
  51. #endregion
  52. }
  53. private void RecursionHtmlNode(TreeNode treeNode, INode htmlNode, bool siblingRequired)
  54. {
  55. if (htmlNode == null || treeNode == null) return;
  56. TreeNode current = treeNode;
  57. TreeNode content ;
  58. //current node
  59. if (htmlNode is ITag)
  60. {
  61. ITag tag = (htmlNode as ITag);
  62. if (!tag.IsEndTag())
  63. {
  64. string nodeString = tag.TagName;
  65. if (tag.Attributes != null && tag.Attributes.Count > 0)
  66. {
  67. if (tag.Attributes["ID"] != null)
  68. {
  69. nodeString = nodeString + " { id=\"" + tag.Attributes["ID"].ToString() + "\" }";
  70. }
  71. if (tag.Attributes["HREF"] != null)
  72. {
  73. nodeString = nodeString + " { href=\"" + tag.Attributes["HREF"].ToString() + "\" }";
  74. }
  75. }
  76. current = new TreeNode(nodeString);
  77. treeNode.Nodes.Add(current);
  78. }
  79. }
  80. //获取节点间的内容
  81. if (htmlNode.Children != null && htmlNode.Children.Count > 0)
  82. {
  83. this.RecursionHtmlNode(current, htmlNode.FirstChild, true);
  84. content = new TreeNode(htmlNode.FirstChild.GetText());
  85. treeNode.Nodes.Add(content);
  86. }
  87. //the sibling nodes
  88. if (siblingRequired)
  89. {
  90. INode sibling = htmlNode.NextSibling;
  91. while (sibling != null)
  92. {
  93. this.RecursionHtmlNode(treeNode, sibling, false);
  94. sibling = sibling.NextSibling;
  95. }
  96. }
  97. }
  98. private void AddUrl()
  99. {
  100. CBUrl.Items.Add("http://www.hao123.com");
  101. CBUrl.Items.Add("http://www.sina.com");
  102. CBUrl.Items.Add("http://www.heuet.edu.cn");
  103. }
  104. }
  105. }
复制代码
实现取来很容易,结合Winista.Htmlparser源码很快就可以实现想要的效果。




作者: hejin67410    时间: 2015-9-6 08:51
谢谢分享




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2