C#Xpath解析HtmlDocument的使用方法与递归取得页面所有标签xpath值(附...
C#Xpath解析HtmlDocument的使⽤⽅法与递归取得页⾯所有标
签xpath值(附源码)
普通浏览 复制代码
1.    //htmlDcoument对象⽤来访问Html⽂档s
2.            HtmlAgilityPack.HtmlDocument hd =  new HtmlAgilityPack.HtmlDocument ( ) ;
3.              //加载Html⽂档
4.            hd.LoadHtml (strhtml ) ;
5.    string str = hd.DocumentNode.SelectSingleNode ( "//*[@id='e_font']" ).OuterHtml ;
这样就可以得到⼀个标签的HTml代码了
OuterHtml是取包含本⾝的Html如果是InnerHtml就是取的包含在这个标签之内的所有Html代码了
这点⼤家要注意了
如果⼤家想获取Html代码的Xpath路径就是这部分
1. //*[@id='e_font']
复制代码
这个其实很简单只在⼤家安装⼀个Firbug就⾏了,
看下图⽚
<ignore_js_op>
⼤家只要进⼊选择模式,然后选择你要的内容,然后右键复制⼀下就⾏了。
然后放在SelectSingleNode()⽅法⾥就OK了
下⾯我说说⼏个⽅法和属性的意思吧、
⽅法
SelectNodes 获取的是⼀个集合
SelectSingleNode 获取⼀个标签
SetAttributeValue 设置标签的属性值例如:SetAttributeValue("name","xpath-89");这说明把name属性的值修改为xpath-89
属性
OuterHtml  是取包含本⾝的Html
InnerHtml  取的包含在这个标签之内的所有Html代码了
XPath  获取相对应的Xpath值
Attributes 获取⼀个属性的值例如:Attributes("name")
也可以进⾏添加属性例如:
普通浏览 复制代码
1. hd.DocumentNode.SelectSingleNode (item.Key ).Attributes.Add ( "xpathid",  "xpath_1"  ) ;
下⾯我写了⼀个递归获取Html页⾯所有Xpath值的⽅法⼤家看⼀下吧
普通浏览 复制代码
1.    //key(Xpath),value(整个节点)
2.          public List<ObjXpath> XpathList =  new List<ObjXpath> ( ) ;
3.          public  string strhtml =  "" ; //这⾥就是你的Html代码具体怎么获取请参考我的<a href=\"www.sufeinet/thread-
3-1-1.html\" target=\"_blank\">HttpHelper</a>类吧
4.            private  int Index =  0 ;
5.  //开始处理Node
6.          private  void SartNode ( )
7.        {
8.              //htmlDcoument对象⽤来访问Html⽂档s
9.            HtmlAgilityPack.HtmlDocument hd =  new HtmlAgilityPack.HtmlDocument ( ) ;
10.              //加载Html⽂档
11.            hd.LoadHtml (strhtml ) ;
12.            HtmlNodeCollection htmllist = hd.DocumentNode.ChildNodes ;
13.            Index =  0 ;
14.            XpathList.Clear ( ) ;
15.              foreach  (HtmlNode em  in htmllist )
16.            {
17.                Setxpath (em ) ;
18.            }
19.        }
20.          /// <summary>
21.          /// 递归获取Html Dom
22.          /// </summary>
23.          /// <param name="node">要处理的节点</param>
24.          private  void Setxpath (HtmlNode node )
25.        {
26.              foreach  (HtmlNode item  in node.ChildNodes )
27.            {
28.                  if  (item. XPath.Contains ( "#" ) )
29.                {
30.                      continue ;
31.                }
32.                  if  (item.ChildNodes.Count >  0 )
33.                {
34.                    XpathList.Add ( new ObjXpath ( ) { id = Index.ToString ( ), Key = item. XPath, Value =  "" } ) ;
35.                    Index++ ;
36.                    Setxpath (item ) ;
37.                }
38.                  else
39.                {
40.                    XpathList.Add ( new ObjXpath ( ) { id = Index.ToString ( ), Key = item. XPath, Value =  "" } ) ;
41.                    Index++ ;
42.                }
43.            }
44.        }
45.    public  class ObjXpath
46.    {
47.          public  string id { get ; set ; }
48.          public  string Key { get ; set ; }
49.          public  string Value { get ; set ; }
50.    }
XpathList 就是获取的所有Xpath值了,⼤家有兴趣的话可以试试
我们先来看看效果吧
<ignore_js_op>
好了下⾯放出所有代码给⼤家
普通浏览 复制代码
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  System. Text. RegularExpressions ;
10.  using  System. Threading ;
11.  using HtmlAgilityPack ;
12.  using  System. IO ;
13.  using  System. Runtime. Serialization.Json ;
14.
15.  namespace AutoXpathTools
16. {
17.      public partial  class Form1 : Form
18.    {
19.          public Form1 ( )
20.        {
21.            InitializeComponent ( ) ;
22.        }
23.
24.          #region 私有变量和⽅法
25.
26.          //委托传⼊⼀个字符串
27.          private  delegate  void SetListBox ( string str ) ;
28.
29.          //key(Xpath),value(整个节点)
30.        List<ObjXpath> XpathList =  new List<ObjXpath> ( ) ;
31.          private  int Index =  0 ;
32.          //htmlDcoument对象⽤来访问Html⽂档
33.        HtmlAgilityPack.HtmlDocument hd =  new HtmlAgilityPack.HtmlDocument ( ) ;
34.
35.          #endregion
36.
37.          //分析Xpath的所有代码
38.          private  void btnGetXpath_Click ( object sender, EventArgs e )
39.        {
40.              try
41.            {
42.                HttpHelper http =  new HttpHelper ( ) ;
43.                HttpItem item =  new HttpItem ( ) { URL = textBox1. Text.Trim ( ), IsToLower =  false, Encoding =  "gbk" } ;
44.                txtXml. Text = http.GetHtml (item ) ;
45.                  if  (! string.IsNullOrWhiteSpace (txtXml. Text ) && txtXml. Text.Trim ( ).ToLower ( ) !=  "error" )
46.                {
47.                      //加载Html⽂档
48.                    hd.LoadHtml (txtXml. Text ) ;
49.
50.
51.                    Thread pingTask =  new Thread ( new ThreadStart ( delegate
52.                    {
53.                          //代码,线程要执⾏的代码
54.                        SartNode (txtXml. Text ) ;
55.                    } ) ) ;
56.                    pingTask.Start ( ) ;
57.
58.                }
59.                  else
60.                {
61.                    txtXml. Text =  "根据您的的ULR:" + textBox1. Text.Trim ( ) +  "⽆法得到任何内容" ;
62.                }
63.            }
64.              catch  (Exception ex )
65.            {
66.                txtXml. Text = ex.Message.Trim ( ) ;
67.            }
68.        }
69.
70.
71.          //开始处理Node
72.          private  void SartNode ( string strhtml )
73.        {
74.              //htmlDcoument对象⽤来访问Html⽂档s
520说说大全 可复制75.            HtmlAgilityPack.HtmlDocument hd =  new HtmlAgilityPack.HtmlDocument ( ) ;
76.              //加载Html⽂档
77.            hd.LoadHtml (strhtml ) ;
78.            HtmlNodeCollection htmllist = hd.DocumentNode.ChildNodes ;
79.            Index =  0 ;
80.            XpathList.Clear ( ) ;
81.              foreach  (HtmlNode em  in htmllist )
82.            {
83.                Setxpath (em ) ;
84.            }
85.        }
86.          /// <summary>
87.          /// 递归获取Html Dom
88.          /// </summary>
89.          /// <param name="node">要处理的节点</param>
90.          private  void Setxpath (HtmlNode node )
91.        {
92.              foreach  (HtmlNode item  in node.ChildNodes )
93.            {
94.                  if  (item. XPath.Contains ( "#" ) )
95.                {
96.                      continue ;
97.                }

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。