asp.net中HtmlAgility读取网页、获取数据、id例子

该篇学习它的解析功能,还可以模拟用户请求,创建html,设置代理等等,暂先不研究。

入门代码:

 代码如下 复制代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using HtmlAgilityPack;
namespace ConsoleApplication1
{
    class Program
    {
static void Main(string[] args)
{
    HtmlWeb webClient = new HtmlWeb();
    HtmlDocument doc = webClient.Load("http://www.baidu.com");
    var rootNode = doc.DocumentNode;
    HtmlNodeCollection categoryNodeList = rootNode.SelectNodes("//html[1]/body[1]");
    foreach (var item in categoryNodeList)
    {
Console.WriteLine("item: " + item.Name);
    }
    Console.Read();
}
    }
}

2.读取

那么,如果是载入本地的Html或者直接读流,字符串。可以这么做

 代码如下 复制代码
HtmlDocument doc = new HtmlDocument();
doc.Load(@"D:xxx.mht", Encoding.UTF8, false);

 
public void LoadHtml(string html);//直接读字符串化的htmlpublic void Load(Stream stream);//流public void Load(string path);//本地路径
 

HtmlDocumen其本身也提供检测编码的方法。

HtmlWeb主要是自动检测编码,如果要自定义编码可以改其中属性。OverrideEncoding, AutoDetectEncoding。而HtmlDocument对编码的操作反而不一样,指定在参数中,估计是自动检测编码已经很强大了把,很少要自己指定。。。。

3.节点选择

rootNode.SelectNodes
rootNode.SelectSingleNode
选择节点和选择单个节点。

用SelectNodes为例,看一下参数

rootNode.SelectNodes("//html[1]/body[1]");
"//"双斜杠表示从根节点查找所有子节点

"/"单斜杠表示只查找第一层子节点

"./"点斜杠表示从当前节点开始查找

 
[]中括号中的代表相同名字的子节点索引。

 代码如下 复制代码

var resultList = rootNode.SelectNodes("//html[1]/body[1]/div[1]/div[position()<5]");//取前4个元素resultList = rootNode.SelectNodes("//html[1]/body[1]/div[1]/div[last()]");//取最后1个元素resultList = rootNode.SelectNodes("//html[1]/body[1]/div[1]/div[@id]");//取所有有id属性的元素resultList = rootNode.SelectNodes("//html[1]/body[1]/div[1]/div[@id='head']");//取属性id值为head的元素

更多属性可以在W3SCHOOL查看
 
取属性

 代码如下 复制代码

doc.Attributes["id"];

取元素
doc.GetElementbyId("id");

补充

HtmlAgilityPack类库用法

1、首先需要获取到html页面数据,可以通过WebRequest类来获取

 代码如下 复制代码

public static string GetHtmlStr(string url)
{   
    try
    {
WebRequest rGet = WebRequest.Create(url);
WebResponse rSet = rGet.GetResponse();
Stream s = rSet.GetResponseStream();
StreamReader reader = new StreamReader(s, Encoding.UTF8);
return reader.ReadToEnd();
    }
    catch (WebException)
    {
//连接失败
return null;
    }
}

2、通过HtmlDocument类加载html数据

 代码如下 复制代码

string htmlstr = GetHtmlStr(http://www.111cn.net);
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(htmlstr);
HtmlNode rootnode = doc.DocumentNode;    //XPath路径表达式,这里表示选取所有span节点中的font最后一个子节点,其中span节点的class属性值为num
//根据网页的内容设置XPath路径表达式
string xpathstring = "//span[@class='num']/font[last()]";   
HtmlNodeCollection aa = rootnode.SelectNodes(xpathstring);    //所有找到的节点都是一个集合

if(aa != null)
{
    string innertext = aa[0].InnerText;
    string color = aa[0].GetAttributeValue("color", "");    //获取color属性,第二个参数为默认值
    //其他属性大家自己尝试
}

也可以通过HtmlWeb类来获得HtmlDocument

 代码如下 复制代码
HtmlWeb web = new HtmlWeb();
HtmlAgilityPack.HtmlDocument doc = web.Load(url);
HtmlNode rootnode = doc.DocumentNode;

 

补充:

多个属性条件查询//div[@align='center' and @height='24']

不存在class属性 //div[not(@class)]

时间: 2024-07-29 07:52:57

asp.net中HtmlAgility读取网页、获取数据、id例子的相关文章

kindeditor编辑器-在asp.net中如何在后台获取kindeditor输入的内容

问题描述 在asp.net中如何在后台获取kindeditor输入的内容 js代码: var editor; KindEditor.ready(function(K) { editor = K.create('textarea[name=""content""]' { allowFileManager : true resizeType : 1 allowPreviewEmoticons : false allowImageUpload : true items :

MVC中使用Knockout,json获取数据成功后,遍历填充视图模型时,代码不执行怎么回事

问题描述 MVC中使用Knockout,json获取数据成功后,遍历填充视图模型时,代码不执行怎么回事 function AppViewModel() { var self = this; self.brandstandards = ko.observableArray(); self.cart = ko.observableArray(); self.orders = ko.observableArray(); function BrandStandardViewModel(firstself

代码-求助各位大神LIstfragment中,分线程获取数据后刷新界面崩溃,用分线程加载数据后

问题描述 求助各位大神LIstfragment中,分线程获取数据后刷新界面崩溃,用分线程加载数据后 如题:代码如下,要在viewpager中的一个fragment中加载一个listview,用分线程加载数据后,handleMessage给成员变量的集合赋值后,notify,会直接崩溃 /** 报警图片 */ public class AlarmPhotoFragment extends ListFragment { private int mType = 0; private ListView

asp.net中使用sqlite无法插入数据

问题描述 asp.net中使用sqlite无法插入数据 提示SQL logic error or missing database no such table: users 解决方案 Asp.net使用Sqlite数据库[学习笔记][asp.net下SQL语句无法向ACCESS数据库插入数据的小提示asp.net使用DataSet数据集插入记录 解决方案二: 没有users这个表,你的sql语句是不是有问题 解决方案三: sql语句没有问题,现在已经解决了,是web.config中的配置有问题,

C语言编程中从密码文件获取数据的函数总结_C 语言

C语言getpw()函数:取得指定用户的密码文件数据头文件: #include <pwd.h> #include <sys/types.h> 定义函数: int getpw(uid_t uid, char *buf); 函数说明:getpw()会从/etc/passwd中查找符合参数uid所指定的用户账号数据, 找不到相关数据就返回-1. 所返回的buf 字符串格式如下: 账号:密码:用户识别码(uid):组识别码(gid):全名:根目录:shell 返回值:返回 0 表示成功,

asp.net中WebRequest Post 及Get 数据实例

sqlserver/42852.htm target=_blank >  代码如下 复制代码   public class WebRequestHelper      {          /// <summary>          /// 以POST 形式请求数据          /// </summary>          /// <param name="RequestPara"></param>          //

asp.net中怎么在网页读取Global中cache数据?

问题描述 我写的的web程序,在Global.asax.cs文件中Global类中给HttpRuntime.Cache.Insert("JsonData",joo);插入了Json格式的数据,想在网页中把数据读取出来.if(HttpRuntime.Cache!=null){stringjo=HttpRuntime.Cache.Get("JsonData")asstring;Response.Write(jo);}读取的jo是空的,请问怎么回事?我应该怎么取到cach

ASP.NET 中根据经纬度怎样获取附近的数据

问题描述 已知一个经纬度,需要查找这个经纬度周围1公里的所有经纬度.有没有大神知道计算公式.小弟在此谢谢各位了. 解决方案 解决方案二:贴出你们自己的计算两个坐标之间距离的公式.地图是一个(椭)球体以不同方式映射到平面上的,因此不同地方.在平面上相同距离的两点所代表的实际距离是不同的.因此不同的映射标准,分别有自己的计算公式.这个计算公式应该给你提供经纬度的人(公司)提供给你.解决方案三:你如果不是做科考应该不会用到这种方式的计算,常用的是找1公里的某些物体,物体的经纬度一般在数据库保存着.我建

httpclient连续访问网页获取数据,是否会遇到缓存

问题描述 我用httpclient的get方法持续访问一个页面,基本上一秒发一次get请求,获取页面上面的文本,这个文本信息是会根据服务器端数据更新的.打个比方,这个信息一般为"False",一天中会有30秒变为"TRUE",我需要捕获这个"TRUE"信息.但是我发现即使服务器端更新了,我的程序获取的依然是"FALSE",并没有获取到更新的信息.我用wireshark监测,我的确是每秒发出一个get请求.那为什么会没拿到那个更