往往在实际开发中,经常会用到一些如抓取网站信息之类的的操作,往往大家采用的是用一些正则的方式获取,但是有时候正则是很死板的,我们常常试想能不能使用jquery的选择器,获取符合自己要求的元素,然后进行操作,例如:我想获取一个网页中关于一款产品的链接,并从这些链接中获取相应产品的数据。如果写正则匹配网址也是 很纠结的事情。但如果能使用jquery选择器难道href的value,然后在验证 就是 一件非常愉快的事情了。

  首先介绍一些今天用的框架:Jumony,这是一个html解析器。(关于html解析器,顾名思义就是对一段html 文本进行解析,解析成可以操作的元素。)当然这并不只是一套html解析器,他还有mvc引擎的功能。

项目地址:https://github.com/Ivony/Jumony

  然后说下这个框架中的术语:

  元素(IHtmlElement)

元素是 HTML 中最常见的一种对象,如下的 HTML 代码便定义了一个元素:

<a href="#title">Text</a>

元素一般由一个开始标签、一个结束标签以及在标签之间的 HTML 内容组成。在上例中, <a href="#title">是开始标签, </a>是结束标签,Text是元素的内容。

也有一些元素不能包含任何内容,这些元素的在 HTML 代码中便没有结束标签,如:

<img src="http://images.cnblogs.com/logo.png">

 抽象:

由于元素可以包含其他的内容,所以元素满足容器(Container)的抽象。而元素也同时是 HTML 文档内容的一部分,所以元素同时也是一个节点(Node)。

  属性(IHtmlAttribute)

属性是元素的一部分,定义在元素的开始标签中,如下的 HTML 定义了一个元素,并且这个元素也包含了一个属性:

<img src="http://images.cnblogs.com/logo.png">

其中的 src="/images.logo.png" 便是一个属性。属性由属性名和属性值所组成,其中src是属性名,而 "/images.logo.png" 则是属性值。 一个元素也可以由多个属性组成:

 抽象:

值得注意的是,属性是元素的一部分,并不直接是 HTML 文档内容的一部分,所以属性并不是一个节点(Node)。

  注释(IHtmlComment)

注释是 HTML 中的一种特殊的标签,下面的 HTML 代码定义了一个注释

<!--Comment Content-->

其中的 Comment Content 即是注释内容。注释内容会被 HTML 排版引擎所忽略。

 抽象:

与元素一样,注释也是 HTML 文档内容的一部分,所以注释也是一个节点(Node)。

  文本节点(IHtmlTextNode)

所有没有被尖括号<>括起来的内容,都是 HTML 文本节点。例如:

文本A<p>文本内容<p>文本B

其中的 文本A 、文本内容 、 文本B 都是 HTML 文本节点

 抽象:

与元素一样,文本节点也是 HTML 文档内容的一部分,所以文本节点是一个节点(Node)。

  特殊节点(IHtmlSpecial)

特殊节点并不是 HTML 标准的一部分,所有无法被识别的标签,都会被分析器解释为特殊节点。例如 DOCTYPE 声明:

<!DOCTYPE html>

或者是代码片段

<%=Eval( "name" )%>

 抽象:

与元素和注释一样,特殊节点也是 HTML 文档内容的一部分,所以特殊节点是一个节点(Node)。

  文档片段(IHtmlFragment)

文档片段是一种特殊的 DOM 对象,其表现为不存在于当前 HTML 文档中的一小段 HTML 片段,文档片段可以随时被插入到文档的指定位置。插入到具体位置后,原有的文档片段对象即被销毁。

文档片段可以通过解析 HTML 而得到

 抽象:

文档可以包含其他内容节点,所以与元素一样,文档也是一个容器。

  文档(IHtmlDocument)

HTML 文档是所有 DOM 对象的根对象,所有的 DOM 对象必然属于某个文档。

文档包含一个可选的 HTML 文档类型声明,一系列的子节点和文档片段。在某个文档上创建的文档片段,只能插入到这个文档的之中。

文档决定了整个 DOM 结构的具体实现,以及依据的 HTML 规范版本,这些将进一步影响到所有 API 的行为。所以针对A文档和B文档的同一个API的行为可能是不同的。

 抽象:

文档可以包含其他内容节点,所以与元素一样,文档也是一个容器。

  容器(IHtmlContainer)

容器是一个抽象对象,其被定义为可以包含子节点的对象。所以,文档、元素、文档片段均符合容器抽象。

IHtmlContainer 接口定义了一个 Nodes 方法获取容器的所有子节点。而 Jumony API 则提供了丰富多样的导航方法可以利用 CSS 选择器查找容器的所有子元素、子代元素。同时,所有的容器都支持 InnerHtml 和 InnerText 方法获取其内容

  节点(IHtmlNode)

节点也是一个抽象对象,其被定义为包含在容器中在文档上有确定位置的对象,元素、文本节点、注释节点和特殊节点均符合节点抽象。但值得注意的是,属性并不是节点。

IHtmlNode 接口定义了 Container 方法获取节点所属的容器。Jumony API 提供了丰富的导航方法可以获取节点的所有父代、兄弟节点和元素以及前后节点和元素。同时,所有的节点都支持 OuterHtml 方法。

  DOM 对象(IHtmlDomObject)

DOM 对象是上面所有对象的抽象。由于文档决定了 DOM 结构的具体实现和所依据的 HTML 规范,所以所有的 DOM 对象的行为均由文档对象决定。故而 IHtmlDomObject 接口定义 Document 属性用于获取 DOM 对象所属的文档。

使用方式:

首先引用 一堆dll

Ivony.Core.dll

Ivony.Html.dll

Ivony.Html.Parser.dll

Ivony.Html.Parser.Regulars.dll

 然后加载网址

 var doc = new JumonyParser().LoadDocument("http://www.baidu.com");

 然后查找你想要的元素

 //查找所有 img 地址

 var ans=doc.Find("img[src]");

 //打印所有src的值

 foreach (var htmlElement in ans)

 {

 Console.WriteLine(htmlElement.Attribute("src").AttributeValue);

 }

.net抓取网页信息 - Jumony框架使用1的更多相关文章

  1. HttpClient+Jsoup 抓取网页信息(网易贵金属为例)

    废话不多说直接讲讲今天要做的事. 利用HttpClient和Jsoup技术抓取网页信息.HttpClient是支持HTTP协议的客户端编程工具包,并且它支持HTTP协议. jsoup 是一款基于 Ja ...

  2. Powershell抓取网页信息

    一般经常使用invoke-restmethod和invoke-webrequest这两个命令来获取网页信息,如果对象格式是json或者xml会更容易 1.invoke-restmethod 我们可以用 ...

  3. 一、使用 BeautifulSoup抓取网页信息信息

    一.解析网页信息 from bs4 import BeautifulSoup with open('C:/Users/michael/Desktop/Plan-for-combating-master ...

  4. C# 使用HtmlAgilityPack抓取网页信息

    前几天看到一篇博文:C# 爬虫 抓取小说 博主使用的是正则表达式获取小说的名字.目录以及内容. 下面使用HtmlAgilityPack来改写原博主的代码 在使用HtmlAgilityPack之前,可以 ...

  5. shell脚本抓取网页信息

    利用shell脚本分析网站数据 # define url time=$(date +%F) mtime=$(date +%T) file=/abc/shell/abc/abc_$time.log ht ...

  6. Fiddle无法抓取网页信息或HTTPS

    1:清除电脑根证书: 打开dos命令框,输入:certmgr.msc ![file](https://img2018.cnblogs.com/blog/1023158/201912/1023158-2 ...

  7. php抓取网页信息

    index.php <?php include_once 'simple_html_dom.php'; //获取html数据转化为对象 $html = file_get_html('http:/ ...

  8. C# 使用 Abot 实现 爬虫 抓取网页信息 源码下载

    下载地址 ** dome **

  9. java模拟用户登录(排除没有验证码情况下,抓取网页信息)

    import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import j ...

随机推荐

  1. [转] error LNK2026: 模块对于 SAFESEH 映像是不安全的

    原文 今天使用VS2012遇到一个问题:"链接器工具错误 LNK2026 XXX模块对于 SAFESEH 映像是不安全的" 解决方法: 1.打开该项目的“属性页”对话框. 2.单击 ...

  2. [Everyday Mathematics]20150131

    在 $\bbR^4$ 中定义如下有界区域 $\Omega$: $$\bex \Omega=\sed{(x,y,z,w)\in\bbR^4;\ |x|+|y|+\sqrt{z^2+w^2}\leq 1} ...

  3. iBatis 和MyBatis区别

    从  iBatis  到  MyBatis ,你准备好了吗? 对于从事 Java EE 的开发人员来说,iBatis 是一个再熟悉不过的持久层框架了,在 Hibernate.JPA 这样的一站式对象 ...

  4. codeforces 675C Money Transfers map

    上面是官方题解,写的很好,然后就A了,就是找到前缀和相等的最多区间,这样就可以减去更多的1 然后肯定很多人肯定很奇怪为什么从1开始数,其实从2开始也一样,因为是个环,从哪里开始记录前缀和都一样 我们的 ...

  5. DataGird导出EXCEL的几个方法

    DataGird导出EXCEL的几个方法(WebControl) using System;using System.Data;using System.Text;using System.Web;u ...

  6. MorningSale 介绍

    MorningSale是一个WEB端的收集门店销售数据,显示销售数据的简单系统,我相信该系统能够有效的提高销售公司在门店销售数据收集 汇总 分析方面的工作效率. 主要功能介绍如下: 1.查看某个店面 ...

  7. android各种适配器的用法(转)

    ArrayAdapter_SimpleAdapter_CursorAdapter的区别 数据源不同而已1. String[]: ArrayAdapter2. List<Map<String ...

  8. vi--文本编辑常用快捷键之复制-粘贴-替换-删除

    这几天刚开始接触vi编辑器,慢慢开始熟悉vi,但是还是感觉诸多不便,比如说复制粘贴删除操作不能用鼠标总是感觉不自在,而且我一般习惯用方向键移动光标,更增加了操作的复杂度,今天在网上搜索了一下,vim编 ...

  9. 配置RHadoop与运行WordCount例子

    1.安装R语言环境 su -c 'rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch. ...

  10. [POJ] #1001# Exponentiation : 大数乘法

    一. 题目 Exponentiation Time Limit: 500MS   Memory Limit: 10000K Total Submissions: 156373   Accepted: ...