前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >HTML Agility Pack 搭配 ScrapySharp,彻底解除Html解析的痛苦

HTML Agility Pack 搭配 ScrapySharp,彻底解除Html解析的痛苦

作者头像
张善友
发布于 2018-01-29 10:27:49
发布于 2018-01-29 10:27:49
1.7K0
举报
文章被收录于专栏:张善友的专栏张善友的专栏

自从 Web 应用程序自 1993 年 W3C 设立以来就开始发展,而且 HTML 也历经了数个版本的演化(1.0 – 2.0 – 3.0 – 3.2 – 4.0 – 4.01),现在也已经成为Web网页或应用程序的最基础,想要学习如何设计 Web 网页或开发 Web 应用程序,这已经是绝对必须要学的东西了,就算是方便的控件(例如 ASP.NET),但 HTML 仍然有学习它的必要性,因此如果不会 HTML,就等于没学过 Web 网页一般。

拜 HTML 与 Web 浏览器蓬勃发展之赐,各式各样的应用都在网络上迅速发展,举凡电子商务、企业门户、在线下单、企业间协同应用等,乃至于社交、个性化、Web 2.0 等商务与组织运用等能力,而在信息爆炸的时代,很多信息整合的应用也随之出炉,而这些信息整合的应用程序都会连接到不同的网站下载其信息,并且在重重的 HTML 中剖析出想要的数据(例如每股价格、涨跌幅、成交量等)。

但是 HTML 本身并不是一个结构严谨的语言,它允许卷标(tag)可以在不 close 的情况下继续使用。这也是因为浏览器设计的高容错性(Fault Tolerance)所致,如此一来,想要依照规则来剖析 HTML 文件几乎变得不可能,而且对方的网站的 HTML 结构也可能会随时变化,在这种情况下,剖析 HTML 变得非常辛苦,虽然 W3C 有另外推展 XHTML(遵守 XML 严谨格式的 HTML),但使用它来设计网页的案例仍为少数,大多数的网站仍然是使用 HTML。因此我们会需要一个工具,能够有方法快速的解析 HTML 以取出我们需要的数据。

大家都知道,HTML 本身其实只是一个 HTML 标记的字符串而已,因此一般说到要解析 HTML,第一个会想到的大概就是字符串比对(string comparison),自己针对 HTML 的结构写一个 pattern,然后由函式去做逐一的比对,例如:

[C#]

1. string pattern = "<td id='stockPrice'>";

2. html.IndexOf(pattern);

不过传统的字符串比对效能太差,也没有一个规则性,因而才发展出正则表达式(Regular Expression)技术,例如下列这样的语法:

[Regular Expression]

1. </?\w+((\s+\w+(\s*=\s*(?:".*?"|'.*?'|[^'">\s]+))?)+\s*|\s*)/?>

但 Regular Expression 的学习曲线很高,若要使用它来解析 HTML,并且再加以定制化(Customization)的话,对于一般开发人员来说,实在没有什么亲和力。

HTML 还有一个特色,就是它是具层性(Hierarchy)的,因此浏览器在解译它的时候都会以文件树(document tree)的方式,再用递归(recursive)的方法来处理它,但 Regular Expression 没有支持层级性的剖析,而最接近阶层剖析又好用的工具,莫过于 XML Parser 了,它的 DOM 以及 XPath 的特性,都可以让解析 XML 的工作变得轻松,然而 XML Parser 无法读取一般的 HTML(XHTML 可以),因为一般的 HTML 是结构松散的类型,XML Parser 会在读入时检查语法结构是否完整(也就是 Well-known 的结构),若读入的是结构松散的内容的话会掷出例外讯息,因此无法直接使用 XML Parser 来辅助。

HTML Agility Pack 是由法国的一位软件架构师 Simon Mourier 所开发,并且由 DarthObiwan 以及 Jessynoo 辅助开发出来的一个软件工具,它可以让剖析松散格式 HTML 的工作就像剖析 XML 一样简单,它也有类似于 System.Xml 命名空间中的 XML DOM 的许多类别,除了可以使用阶层的方式存取 HTML 以外,它也支持使用 XPath 的方式来搜寻 HTML,这会较以往使用文字比对或是 Regular Expression 的比对方式来得更明确。

若要使用 HTML Agility Pack 组件,可先上 Codeplex 的 HTML Agility Pack 网站下载二进制文件(同时也提供源代码、说明文件以及 HAP Explorer 工具程序可下载),并解压缩后,在项目加入对 HtmlAgilityPack.dll 的引用。

Html Agility Pack 源码中的类大概有28个左右,其实不算一个很复杂的类库,但它的功能确不弱,为解析DOM已经提供了足够强大的功能支持,可以跟jQuery操作DOM媲美:)Html Agility Pack最常用的基础类其实不多,对解析DOM来说,就只有HtmlDocument和HtmlNode这两个常用的类,还有一个 HtmlNodeCollection集合类。

HTML Agility Pack的操作起来还是很麻烦,下面我们要介绍的这个组件是ScrapySharp,他在2个方面针对Html Agility Pack进行了包装,使得解析Html页面不再痛苦,幸福指数直线上升到90分哈。

ScapySharp有了一个真实的浏览器包装类(处理Reference,Cookie等),另外一个就是使用类似于jQuery一样的Css选择器和Linq语法。让我们使用起来非常的爽。它的代码放在 https://bitbucket.org/rflechner/scrapysharp。也可以通过Nuget添加

下面我们来看一段解析博客园的博客文章的代码:

代码语言:js
AI代码解释
复制
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using HtmlAgilityPack; 
using ScrapySharp.Extensions; 
using ScrapySharp.Network; 
namespace HTMLAgilityDemo 
{ 
    class Program 
    { 
        static void Main(string[] args) 
        { 
            var uri = new Uri("http://www.cnblogs.com/shanyou/archive/2012/05/20/2509435.html"); 
            var browser1 = new ScrapingBrowser(); 
            var html1 = browser1.DownloadString(uri); 
            var htmlDocument = new HtmlDocument(); 
            htmlDocument.LoadHtml(html1); 
            var html = htmlDocument.DocumentNode; 
            var title = html.CssSelect("title"); 
            foreach (var htmlNode in title) 
            { 
                Console.WriteLine(htmlNode.InnerHtml); 
            } 
            var divs = html.CssSelect("div.postBody"); 
            foreach (var htmlNode in divs) 
            { 
                Console.WriteLine(htmlNode.InnerHtml); 
            } 
            divs = html.CssSelect("#cnblogs_post_body"); 
            foreach (var htmlNode in divs) 
            { 
                Console.WriteLine(htmlNode.InnerHtml); 
            } 
        } 
    } 
}
Basic examples of CssSelect usages:
var divs = html.CssSelect("div");  //all div elements
var nodes = html.CssSelect("div.content"); //all div elements with css class ‘content’
var nodes = html.CssSelect("div.widget.monthlist"); //all div elements with the both css class
var nodes = html.CssSelect("#postPaging"); //all HTML elements with the id postPaging
var nodes = html.CssSelect("div#postPaging.testClass"); // all HTML elements with the id postPaging and css class testClass 
var nodes = html.CssSelect("div.content > p.para"); //p elements who are direct children of div elements with css class ‘content’ 
var nodes = html.CssSelect("input[type=text].login"); // textbox with css class login 
We can also select ancestors of elements:
var nodes = html.CssSelect("p.para").CssSelectAncestors("div.content > div.widget");

参考文章:

HTML Agility Pack:簡單好用的快速 HTML Parser

开源项目Html Agility Pack实现快速解析Html

c#中的jQuery——HtmlAgilityPack

Html Agility Pack基础类介绍及运用

.Net解析html文档类库HtmlAgilityPack完整使用说明--采集软件开发尤其好用

Crawler-Lib Crawler Engine

挖掘百度关键词示例:BaiduTools.zip

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2012-05-27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
推荐2个.Net开源Html解析器,方便我们提取网页数据
如果我们需要抓取网络上的数据,这时候我们就要写爬虫,这里面就涉及到网页的抓取、以及网页分析与数据提取。
郑子铭
2025/04/23
1560
推荐2个.Net开源Html解析器,方便我们提取网页数据
C#解析HTML利器-Html Agility Pack
今天刚开始做毕设....好吧,的确有点晚。我的毕设设计需要爬取豆瓣的电影推荐,于是就需要解析爬取下来的html,之前用Python玩过解析,但目前我使用的是C#,我觉得C#不比python差,有微软大大在,这个不需要担心,主要还是生态问题。查了下资料,发现Html Agility Pack是比较好的,当然还有其他的,我就不说了,主要使用它做的。
Ryan_OVO
2023/10/18
5270
使用C#也能网页抓取
网页抓取是通过自动化手段检索数据的过程。它在许多场景中都是不可或缺的,例如竞争对手价格监控、房地产清单列表、潜在客户和舆情监控、新闻文章或金融数据聚合等。
用户7850017
2021/09/13
6.9K0
使用C#也能网页抓取
1.HtmlAgilityPack 爬取优酷电影名
爬虫的制作主要分为三个方面 1、加载网页结构 2、解析网页结构,转变为符合需求的数据实体 3、保存数据实体(数据库,文本等)
happlyfox
2018/10/31
1.1K0
HtmlAgilityPack 总结(一)
大家好,又见面了,我是你们的朋友全栈君。一个解析html的C#类库HtmlAgilityPack,
全栈程序员站长
2022/09/14
1.6K0
使用TaskManager爬取2万条代理IP实现自动投票功能
本文介绍了如何通过C#代码实现一个简单的类似DOS命令行的工具,该工具可以接收用户输入的URL,并解析出网页中需要提取的URL链接,最终通过WebBrowser控件将页面展示在用户面前。
用户1168362
2018/01/05
1.1K0
使用TaskManager爬取2万条代理IP实现自动投票功能
.NET Core 网络数据采集 -- 使用AngleSharp做html解析
有这么一本Python的书: <<Python 网络数据采集>> 我准备用.NET Core及第三方库实现里面所有的例子.  这是第一部分, 主要使用的是AngleSharp: https://ang
solenovex
2018/05/30
4.4K0
【Java爬虫】007-网页内容解析:HTML解析与XML解析
HtmlCleaner是另外一款基于Java开发的HTML文档解析器,支持Xpath语法提取HTML中的节点和元素;
訾博ZiBo
2025/01/06
1620
【Java爬虫】007-网页内容解析:HTML解析与XML解析
使用C#和HtmlAgilityPack打造强大的Snapchat视频爬虫
Snapchat作为一款备受欢迎的社交媒体应用,允许用户分享照片和视频。然而,由于其特有的内容自动消失特性,爬虫开发面临一些挑战。本文将详细介绍如何巧妙运用C#和HtmlAgilityPack库,构建一个高效的Snapchat视频爬虫。该爬虫能够从Snapchat网页版中提取视频链接,并将其下载保存到本地。为了提升爬虫的效率和可靠性,我们将使用代理IP技术和多线程技术,以规避Snapchat的反爬机制。
jackcode
2023/11/27
3940
使用C#和HtmlAgilityPack打造强大的Snapchat视频爬虫
如何使用C#和HTMLAgilityPack抓取网页
HTMLAgilityPack是一款备受欢迎的用于解析和操作HTML文档的库。在使用之前,开发者需要考虑一些优缺点。下面是一些值得注意的优点:
jackcode
2023/05/23
1.8K0
如何使用C#和HTMLAgilityPack抓取网页
C#操作EML邮件文件实例(含HTML格式化邮件正文和附件)
使用QQ邮箱、163邮箱等导出的EML邮件,包含了邮件的发件人、主题、内容、附件等所有信息,该实例就如何解析这些信息,并在编辑后保存做个Demo。 如下图所示,EML文件是编码后的文本文件,可以使用正
用户1637609
2018/04/12
3.2K1
C#操作EML邮件文件实例(含HTML格式化邮件正文和附件)
HTML解析之DOMContentLoaded和onload
在很久很久以前,我在封装自己的JQuery库时就使用过DOMContentLoaded,觉得这个知识点看看别的文章就行了,不过现在我想把它记下来。
全栈程序员站长
2022/11/16
1.7K0
HTML解析之DOMContentLoaded和onload
网页解析高手:C#和HtmlAgilityPack教你下载视频
在当今互联网时代,视频内容已成为人们获取信息和娱乐的重要途径之一。而小红书作为一个内容丰富的社交平台,其中的视频资源备受关注。本文将介绍如何利用C#编程语言和HtmlAgilityPack库来解析小红书网页,从而下载小红书视频。
jackcode
2024/03/26
3440
网页解析高手:C#和HtmlAgilityPack教你下载视频
HTMLDocument和XMLDocument 的children
document.children  或者 DOM元素的children都是可以访问的,它返回是该节点下的所有Element节点。 它们同样还有一个childNodes属性,它返回所有节点,区别就是它包含所有文字节点,注释节点等等,它一般比 children返回的元素多。
申君健
2018/09/21
1.3K0
C#中的WebClient与XPath:实现精准高效的Screen Scraping
在现代互联网中,Screen Scraping(屏幕抓取)已成为从网页中提取信息的重要技术。对于C#开发者来说,WebClient和XPath是实现高效抓取的重要工具。本文将概述如何使用C#中的WebClient类结合XPath技术,实现精准高效的Screen Scraping,并通过代理IP、user-agent、cookie设置和多线程技术来进一步提升采集效率。
jackcode
2024/08/21
2560
一小时掌握:使用ScrapySharp和C#打造新闻下载器
爬虫技术是指通过编程的方式,自动从互联网上获取和处理数据的技术。爬虫技术有很多应用场景,比如搜索引擎、数据分析、舆情监测、电商比价等。爬虫技术也是一门有趣的技术,可以让你发现网络上的各种有价值的信息。
jackcode
2024/01/11
2830
一小时掌握:使用ScrapySharp和C#打造新闻下载器
C#爬虫知识介绍
爬虫(Web Crawler)是指使用程序自动获取互联网上的信息和数据的一种技术手段。它通常从一个起始网址出发,按照一定的规则递归地遍历网页,并将有用的信息提取出来,然后存储到本地或者数据库中,以供后续分析和使用。爬虫的本质是通过程序模拟了人类在互联网上的浏览、搜索行为,把互联网上的信息主动拉取到自己的数据库中,从而实现全网数据的自动化采集和处理。
明志德道
2023/10/21
4300
C#爬虫知识介绍
如何使用 C# 爬虫获得专栏博客更新排行
昨天,梦姐问我们,她存在一个任务,找到 关注数排行100 和 浏览量排行100 的专栏博客,在2017年还有更新的专栏。 梦姐说他要出去一趟,M大神在吃饭,于是我估算时间,只有半个钟。 整理一下:半个钟时间,找到两个表格中,在2017年更新的专栏。这就是需求。
林德熙
2018/09/18
1.1K0
如何使用 C# 爬虫获得专栏博客更新排行
网页解析
网页解析完成的是从下载回来的html文件中提取所需数据的方法,一般会用到的方法有:
爱编程的小明
2022/09/06
3.4K0
网页解析
VB.NET 用HtmlAgilityPack解析百度文库,获取百度文库中的内容(以富甲美国为例)
1.首先在浏览器安装 "save as we "插件(用于把网页保存成HTML文件)
办公魔盒
2019/07/22
8870
VB.NET 用HtmlAgilityPack解析百度文库,获取百度文库中的内容(以富甲美国为例)
推荐阅读
相关推荐
推荐2个.Net开源Html解析器,方便我们提取网页数据
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档