网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
01月09日漏签0天
c#吧 关注:188,724贴子:824,254
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 14回复贴,共1页
<<返回c#吧
>0< 加载中...

C#中使用HtmlAgilityPack利器对html进行Xpath解析

  • 只看楼主
  • 收藏

  • 回复
  • q514849152
  • c#攻城狮
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
xpath一般使用在xml的解析上比较多,实际上html是xml的一个子集。在.Net中为了方便我们对html进行操作微软为我们提供了一个轻量级并且开源的类库HtmlAgilityPack(点击下载)。比如我们想截取网页上某一部分文字获取其他元素的时候我们一般都是使用正则表达式一步一步的来进行处理的,这个过程相当的繁琐特别是对正则表达式不熟悉的情况,通过HtmlAgilityPack这个过程就变得相当简单了。下面我们来看下HtmlAgilityPack的基本使用方法。
在使用HtmlAgilityPack之前第一步当然是下载了,下载完成解压出来之后我们可以看到几个文件夹,如下图:

基本上支持.Net所有的平台啦,大家可以根据自己的需求来进行选择。在项目中添加引用就可以了。下面我们来看几个例子来熟悉一下HtmlAgilityPack的使用。
Demo 1:获取http://www.studycsharp.com 首页的所有板块的链接?
首先我们必须知道其中一个板块的xpath,然后我们在进行分析,怎么获取页面的xpath?在google浏览器或者火狐浏览器中有一个很好用的插件,当我们选中某一元素时点击右键会出来一个“审查元素的”选项如下图:

点击"审查元素"之后的页面

接下来我们点击Copy Xpath这个选项这个元素的Xpath就被复制到剪贴板了,下面我们截取两个板块的Xpath来进行分析,如下:
"C#常用工具类"的Xpath: //*[@id="category_63"]/table/tbody/tr[2]/td[2]/dl/dt/a
"C#PDF书籍"的xpath: //*[@id="category_1"]/table/tbody/tr/td[2]/dl/dt/a
分析出来的结果:ID是一个变量每个板块的ID都不一样,但是也有通性他们都是以"category_"开头的。tr[2] td[2]中的数字是不固定的。
分析出来结果后就可以对Xpath进行构造了,最终构造出来的Xpath为://*[starts-with(@id,'category_')]/table/tr/td/dl/dt/a,tbody这个元素被我去掉了因为我发现加上tbody这个标签后居然没办法解析,[starts-with(@id,'category_')]这一句的意思是获取html根元素下所有ID以category_开头的子元素,tr[2]td[2]中的数字被我换成了*因为tr td的位置是不固定的所以选择了通配符*。
说了这么多看下代码吧:
[C#] 纯文本查看 复制代码?
0102030405060708091011121314151617 //第一步声明HtmlAgilityPack.HtmlDocument实例 HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); //获取Html页面代码 string html = HTMLHelper.Get_Http("http://www.studycsharp.com/"); //第二步加载html文档 doc.LoadHtml(html); //第三步通过Xpath选中html的指定元素 这样子就获取到了[url=http://www.studycsharp.com]http://www.studycsharp.com[/url]的"常用工具类"的板块链接了 HtmlAgilityPack.HtmlNode htmlnode = doc.DocumentNode.SelectSingleNode("//*[@id=\"category_63\"]/table/tr[2]/td[2]/dl/dt/a"); //获取所有板块的a标签 HtmlAgilityPack.HtmlNodeCollection collection = doc.DocumentNode.SelectNodes("//*[starts-with(@id,'category_')]/table/tr/td/dl/dt/a"); StringBuilder sb = new StringBuilder(); foreach (HtmlAgilityPack.HtmlNode item in collection) { sb.Append(string.Format("{0}:{1}\r\n", item.InnerText, item.Attributes["href"].Value)); } this.textBox1.Text = sb.ToString();
效果图如下:


  • 可更换零部件
  • c#诠释者
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
mark一下


2026-01-09 15:06:17
广告
不感兴趣
开通SVIP免广告
  • xhy342806
  • c#架构狮
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
大神!


  • 芰荷为群
  • c#牛人
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
mark


  • 三台
  • c#诠释者
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
嗯?微软给我们提供?


  • 呼呼街L圣
  • c#爱好者
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

O__O"
————呼呼街,卓然天成,为发骚而生,超长护翼,完美防侧漏。


  • 秋明安康
  • c#爱好者
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
@q514849152 楼主你好!我被一个问题困扰挺久了,希望得到你的帮助。
【原始html】
<table width="770" border="0" cellpadding="0" cellspacing="0">
<tr>
<td class="even" width="640" valign="middle">
<span style="line-height: 20px;">10年≤年限<50年</span>
</td>
</tr>
</table>
【需要达到的效果】
提取出“10年≤年限<50年”
----------------
【遇到的问题】
用InnerHtml时,取不到“<50年”,只能取到“10年≤年限”这样的结果;
用OuterHtml时,只能取到“<span style="line-height: 20px;">10年≤年限<></span>”;
我猜,是不是HtmlAgilityPack把小于号“<”当做html标签来看待了?
我该如何做才能正确取出“10年≤年限<50年”这个结果呢?


  • q514849152
  • c#攻城狮
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
有没有谷歌浏览器 有的话 xpath不用自己写


2026-01-09 15:00:17
广告
不感兴趣
开通SVIP免广告
  • CodingNinja
  • c#大牛
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
之前做的一个app一直用这个,但总是出乎意料。。。可能不太会用,mark一下


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 14回复贴,共1页
<<返回c#吧
分享到:
©2026 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示