vb抓取网页内容( 一款处理网络数据的框架HtmlAgilityPack,(xml)(图) )
优采云 发布时间: 2022-03-22 23:07vb抓取网页内容(
一款处理网络数据的框架HtmlAgilityPack,(xml)(图)
)
HtmlAgilityPack 网页数据处理
发表于:2019/1/19 1:38
HtmlAgilityPack 网络数据处理
新的一年,新气象!祝大家新年快乐,万事如意,万事如意,身体健康!
今天我说的是一个用于处理网络数据的框架HtmlAgilityPack,
相信很多同事都因为处理网页数据和写正则表达式而一团糟。如果你使用这个框架,你会如鱼得水,释放你长久以来的复杂情绪!
介绍:
它是一个敏捷的 HTML 解析器,它构建一个读/写 DOM 并支持普通的 xpath 或 xslt(你实际上不需要了解 xpath 或 xslt 来使用它,不用担心......)。
它是一个 .NET 代码库,可让您“离线”解析 HTML 文件。
解析器对“真实世界”格式错误的 HTML 非常宽容。对象模型与 System.xml 建议的非常相似,但用于 HTML 文档(或流)。
原理:将抓取的网页转换为Dom文档模型(xml),然后进行元素搜索
动手案例:
(1)首先创建一个控制台项目learningHtmlAgilityPack
(2)选择引用右键-->点击Manage NuGet Packages-->点击Browse-->Search HtmlAgilityPack
从这里我们可以看到这里最新的稳定版本是v1.8.13 然后点击安装。
(3)安装完成后我们以百度为例获取百度搜索按钮的值
1、打开开发者工具获取百度搜索按钮的XPath路径,确认无误后进行下一步(注:Chome浏览器可以识别class、id等元素属性;Firefox会从 /head 开始查找)
2. 通过简洁的代码实现目标
using System.Net;
namespace learningHtmlAgilityPack
{
class Program
{
static void Main(string[] args)
{
//实例化常规请求方式
WebClient wc = new WebClient();
//获取网页数据
var vb = wc.DownloadData("https://www.baidu.com/");
//转码
var str = System.Text.Encoding.UTF8.GetString(vb);
//实例化 HtmlAgilityPack 对象模型
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
//加载文档对象模型
doc.LoadHtml(str);
//获取到百度按钮节点 把我们刚刚复制的XPath粘贴上去
HtmlAgilityPack.HtmlNode htmlnode = doc.DocumentNode.SelectSingleNode("//*[@id='su']");
//获取值 1,元素名称 2,当没有该元素时返回的内容
string value = htmlnode.GetAttributeValue("value", "");
System.Console.WriteLine(value);
System.Console.ReadKey();
}
}
}
运行结果:
困难:
(1),实现多个标签的集合(每个元素通过遍历得到)
HtmlAgilityPack.HtmlNodeCollection collection = doc.DocumentNode.SelectNodes("//*[@id='addToCart']//div");
foreach (var item in collection)
{
if (!string.IsNullOrEmpty(item.GetAttributeValue("name", "")))
{
//想怎么干就怎么搞xxxxx
}
}
(2),如果item下面有更多便签或者标签,还是这样写,但是获取第二层的时候不需要XPath//
HtmlAgilityPack.HtmlNodeCollection collection = doc.DocumentNode.SelectNodes("//*[@id='addToCart']//div");
foreach (var item in collection)
{
if (!string.IsNullOrEmpty(item.GetAttributeValue("name", "")))
{
//HtmlAgilityPack.HtmlNode htmlnode = item.SelectSingleNode("//*[@id='su']");
HtmlAgilityPack.HtmlNodeCollection childs = item.SelectSingleNode("ul/li");
foreach(var singeitem in childs)
{
//xxxx
}
}
}