Jumony是一个开源项目,已经有三年的历史了,在这三年中,秉承提供给.NET程序员完整的HTML掌控能力,Jumony历经无数次的改进,终于进入了一个新的阶段。Jumony Core 3是一个真正意义上的HTML引擎。

Jumony Core 3目前已经在NuGet上发布,请直接在NuGet包管理器中搜索 Jumony Core ,即可下载。

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

一、解析器

也许很多人会认为,目前的HTML解析器已经足够了,甚至于简单的正则,也已经可以满足操纵HTML文档的需求。是的,对于互联网上绝大多数的HTML文档,事实上都大部分满足了XHTML的规范,对于它们的解析,并不需要多么强大的解析器。但是强大的解析器是一回事,而完美的解析器又是另一回事。

Jumony Core首先提供了一个近乎完美的HTML解析引擎,其解析结果无限逼近浏览器的解析结果。不论是无结束标签的元素,可选结束标签的元素,或是标记属性,或是CSS选择器和样式,一切合法的,不合法的HTML文档,浏览器解析成啥样,Jumony就解析成啥样。也就是说,Jumony解析的结果,与浏览器解析的结果别无二致,让你可以再也不用关心HTML文档是否可以被识别,浏览器能看,Jumony就能解。

完美和强大只有一步之遥,但是完美的解析器可以让你永远不用关心HTML源文档。

以下是Jumony解析器所支持的特性不完全列表

特性 例子
孤立的<解析为文本 < a应当解析为&lt; a
孤立的>解析为文本 <a>></a>应当解析为<a>&gt;</a>
标记属性(没有值的属性) <input type="text" checked />
元素丢失结束标签 <div><a href="test.html">测试链接</div>
可选结束标签元素
"body", "colgroup", "dd", "dt", "head", "html", "li", "option", "p", "tbody", "td", "tfoot", "th", "thead", "tr"
<p>abc<p>123
无结束标签元素
"area", "base", "basefont", "br", "col", "frame", "hr", "img", "input", "isindex", "link", "meta", "param", "wbr", "bgsound", "spacer", "keygen"
<img src="1.jpg">
CData元素 <script>if ( 1<a ) alert( "<div>" );</script>
"script", "style", "textarea", "title"  
预格式化元素 <pre>    前面有空格</pre>
属性值使用单引号 <a href='#'>
属性值使用双引号 <a href="#"
属性值不使用引号 <a href=#>
属性值丢失(但有等号) <a href=>
属性值前面有空格 <a href= "test.html">
解析HTML声明 <!DOCTYPE html>

不仅仅是可以从文本中解析HTML,Jumony的API可以从互联网上直接抓取文档分析,并根据HTTP头自动识别编码:

new JumonyParser().LoadDocument( "http://www.cnblogs.com/" ).Find( ".post_item a.titlelnk" )

而目前仅次于Jumony的HTML解析开源项目HtmlAgilityPack早已停止了更新 ,这么多年过去了,对于最基本的<form>元素的解析都还存在问题。

二、CSS样式设置支持

仅仅只是完美解析HTML,并不能带来多少好处,上面已经说过,事实上大部分的HTML文档,都可以用二流的解析器甚至是简单的正则表达式加以分析,那么为什么我们需要Jumony呢?

答案是一个HTML引擎不仅仅是解析DOM结构这么简单。

考虑这样的场景:我需要给一个元素的display样式设置一个none值。在浏览器中,我们只需要简单的element.style.display = "none"便可以满足我们的要求。现在,通过解析器已经得到了我们所需要的DOM,但设置样式还需要进行字符串的拼接么?

不需要,Jumony支持CSS样式解析,甚至部分CSS样式缩写规则也能识别,在Jumony中,给元素设置一个样式和在浏览器中一样简单:

element.Style( "display", "none" )

我们再来看这样的例子:<div style="padding: 5px"></div>,如果我们对这个元素设置padding-left: 0px会怎样?

在Jumony中,结果会是:<div style="padding-left: 0px; padding-right: 5px; padding-top:5px; padding-bottom: 5px"></div>,看,padding属性被神奇的自动展开了。

三、CSS 3选择器支持

CSS选择器是HTML世界通行的查询语言,其简洁有力且被众多浏览器支持。Jumony也支持几乎完整的CSS3选择器(除去运行时伪类及伪对象)。借助选择器,我们可以轻松的在HTML中找到我们感兴趣的对象。例如抓取博客园首页所有文章标题:

new JumonyParser().LoadDocument( "http://www.cnblogs.com/" ).Find( ".post_item a.titlelnk" )

抓取,分析,选择,一气呵成,只需要简单的代码,我们就能在控制台输出我们抓取到的数据:

foreach( var title = new JumonyParser().LoadDocument( "http://www.cnblogs.com/" ).Find( ".post_item a.titlelnk" ) )
Console.WriteLine( title.InnerText() );

Jumony支持的CSS3选择器列表:

选择器 描述
* 选择所有元素
p a 选择子代元素
p>a 选择子级元素
p+a 选择相邻元素
p~a 选择后继元素
[attr] 属性存在选择
[attr=value] 属性值精确匹配
[attr~=value] 属性值近似匹配
[attr^=value] 属性值开头匹配
[attr*=value] 属性值包含匹配
[attr$=value] 属性值结尾匹配
[attr!=value] 属性值否定匹配
:not 否定伪类
:only-child 唯一子元素伪类
:only-of-type 唯一类型伪类
:empty 空元素伪类
:nth-child 结构化伪类
:nth-last-child 结构化伪类
:nth-of-type 结构化伪类
:nth-last-of-type 结构化伪类
:first-child 结构化伪类
:last-child 结构化伪类
:first-of-type 结构化伪类
:last-of-type 结构化伪类

四、强大的可扩展性

在Jumony Core 3,为用户提供了最大的可扩展性,你可以自定义HTML规范,实现自己的解析器,将其他DOM模型嫁接到Jumony API上,发明自己的CSS选择器伪类,甚至于自己换一套API,例如jQuery风格的。

Jumony Core拥有许多的衍生项目,例如爬取网站,提供jQuery风格的 API、进行网站开发、制作MHT文件、为HAP的解析结果增加CSS选择器支持等等,这些项目都得益于Jumony Core强大的可扩展性,从而发挥出强大的功能。

Jumony也提供了一个快速上手的指南,帮助大家快速的熟悉Jumony:

http://demo.jumony.net/help?path=~%2fHelpEntries%2fQuickStart%2f

如你所见,这个网站也是采用Jumony进行驱动的,它会检索网站下所有的HTML页面,并抽取页面的标题以及简介,形成导航目录和概要页面。

为了照顾没有Visual Studio的同学,这里提供一个压缩包的下载:

http://files.cnblogs.com/Ivony/JumonyCore.3.0.5.2.zip

但使用Visual Studio开发的最佳实践是直接使用NuGet管理你所有的程序包。

Jumony Core 3,真正的HTML引擎,正式版发布的更多相关文章

  1. .NET Core 3.0正式版发布

    是的,.NET Core 3.0正式版发布了,令人兴奋. WPF 其实,.NET Core 2.1开始已经是个很完善的版本,3.0又带来了什么呢?我站在我的使用角度来看,最最令人振奋的就是:能用WPF ...

  2. 最强 IDE Visual Studio 2017 正式版发布

    Visual Studio 2017 正式版发布,该版本不仅添加了实时单元测试.实时架构依赖关系验证等新特性,还对许多实用功能进行了改进,如代码导航.IntelliSense.重构.代码修复和调试等等 ...

  3. 终于等到你,最强 IDE Visual Studio 2017 正式版发布

    Visual Studio 2017 正式版发布,该版本不仅添加了实时单元测试.实时架构依赖关系验证等新特性,还对许多实用功能进行了改进,如代码导航.IntelliSense.重构.代码修复和调试等等 ...

  4. Nest.js 6.0.0 正式版发布,基于 TypeScript 的 Node.js 框架

    开发四年只会写业务代码,分布式高并发都不会还做程序员?   Nest.js 6.0.0 正式版发布了.Nest 是构建高效.可扩展的 Node.js Web 应用程序的框架.它使用现代的 JavaSc ...

  5. .NET 5.0 RC1 发布,离正式版发布仅剩两个版本

    原文:http://dwz.win/Qf8 作者:Richard 翻译:精致码农-王亮 说明:1. 本译文并不是完全逐句翻译的,存在部分语句我实在不知道如何翻译或组织就根据个人理解用自己的话表述了.2 ...

  6. Element Plus 正式版发布啦!🎉🎉

    今天,我们非常高兴地宣布 Element Plus 稳定版正式发布.自第一个 commit 起,经过 1 年零 7 个月的持续迭代开发,总计 2635 commits,经过 256 位贡献者所提交的 ...

  7. Angular2正式版发布,Wijmo抢先支持

    Angular2正式版发布 9月15日,Angular 2 的最终版正式发布了.作为 Angular 1 的全平台继任者 -- Angular 2 的最终版,意味着什么? 意味着稳定性已经得到了大范围 ...

  8. Redis 3.0正式版发布,正式支持Redis集群

    Redis是一个开源.基于C语言.基于内存亦可持久化的高性能NoSQL数据库,同时,它还提供了多种语言的API.近日,Redis 3.0在经过6个RC版本后,其正式版终于发布了.Redis 3.0的最 ...

  9. PyPy 2.1 正式版发布

    PyPy 2.1 Beta1 才刚刚在2天前发布,今天 PyPy 宣布 2.1 正式版发布. 值得关注的改进内容有: JIT support for ARM, architecture version ...

  10. Appium路线图及1.0正式版发布

    Appium更新的速度极快,从我试用时候的0.12到1.0(0.18版本后就是1.0),完全符合移动互联网的节奏. 更新可能会慢,可以多试几次 整理了testerhome上思寒发表的帖子,让我们来看下 ...

随机推荐

  1. jQuery构造函数分析

    在我的上一篇文章里面 阐述了jQuery的大致框架,知道了所有代码都是写在了一个自调用匿名函数里面,并且传入了window对象,源码是这样的: (function( window, undefined ...

  2. 四步让你的网站秒开,wordpress框架为例子,其他框架道理类似

    我这里以wordpress框架制作的网站为例子,效果可以看看我的网站,香港的垃圾主机199一年2M带宽,速度也能秒开,不信试试效果33小游戏 我的是wordpress制作的网站,大家都知道WP各种臃肿 ...

  3. ASP.NET Mvc实用框架(一)Ioc、仓储模式和单元工作模式

    Framework.EF 首先看一下这个类库: Extended文件夹存放的是EntityFramework.Extensions这个插件的源代码,没有别的原因,就是本人觉得这个插件挺好的,每次省的下 ...

  4. 关于arcgis engine的注记显示与关闭问题

    1.注记的添加需要拿到IGeoFeatureLayer接口下的AnnotationProperties属性,转为IAnnotationLayerPropertiesCollection接口,并创建一个 ...

  5. android对话框的EditText点击后不显示输入法的问题

    dialog.show(); // 以下两行代码是对话框的EditText点击后不能显示输入法的 dialog.getWindow().clearFlags( WindowManager.Layout ...

  6. C语言基于GTK+Libvlc实现的简易视频播放器

    小编心语:现下,各种视频播放软件层出不穷,竞争也越演越烈,不知道大家有木有这个想法,小编有时在想能不能做一款属于自己的视频播放器呢~小编特意去实验楼,整理出了这篇关于如何实现简易视频播放器的博文.简易 ...

  7. 配置git同时push到两个远端库的简单方法

    最近在写一个开源的论坛系统,在发布代码时选择了github和coding这两个平台,我手懒,不想敲两次git push了,所以说突然有了一个很奇怪的需求:用一条git push同时push到两个远端代 ...

  8. SQL SERVER普通用户需要什么权限才能执行sp_configure命令

    SQL SERVER普通用户需要什么权限才能执行sp_configure命令呢? 例如如下存储过程所示 CREATE PROCEDURE PRC_TEST AS BEGIN    exec sp_co ...

  9. service mysql start出错,

    service mysql start出错,mysql启动不了,解决mysql: unrecognized service错误的方法如下: [root@ctohome.com ~]# service ...

  10. linux中通配符和常用特殊符号

    1 通配符   2 特殊符号 3 参考文档 鸟哥的私房菜 http://vbird.dic.ksu.edu.tw/linux_basic/0320bash_4.php#settings_wildcar ...