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

作者:袖梨 2022-06-25

该篇学习它的解析功能,还可以模拟用户请求,创建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.b**aid*u.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()

更多属性可以在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(https://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 @]

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

相关文章

精彩推荐