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. How To Restart timer service on all servers in farm

    [array]$servers= Get-SPServer | ? {$_.Role -eq "Application"} $farm = Get-SPFarm foreach ( ...

  2. Windows TCP连接数限制解决

    reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters" /v "M ...

  3. iOS字体

  4. html中select标签根据枚举获得值的总结

    不知不觉在公司一个多月了,这一个月做了一个支票申请的web页面功能,都不是特别难,审核有公司给的工作流,分页工具和很多公用工具公司也都给了,所以觉得难度都不是很大.今天主管让我们修改了以前做的项目的代 ...

  5. CoreGraphics-线段常见属性及渲染模式介绍

    线段常见属性: 1.线宽 2.线头样式 3.接头样式 4.颜色(包括描边颜色和填充颜色) override func draw(_ rect: CGRect) { // 获取图形上下文对象 let c ...

  6. 【代码笔记】iOS-下拉选项cell

    一,效果图. 二,工程图. 三,代码. RootViewController.h #import <UIKit/UIKit.h> //加入头文件 #import "ComboBo ...

  7. Android添加图片到ListView或者 RecyclerView显示

    先上图 点击+号就去选择图片 实际上这个添加本身就是一个ListView或者 RecyclerView 只是布局有些特殊 item <?xml version="1.0" e ...

  8. Objective-C内存管理之-引用计数

    本文会继续深入学习OC内存管理,内容主要参考iOS高级编程,Objective-C基础教程,疯狂iOS讲义,是我学习内存管理的笔记 内存管理 1 内存管理的基本概念 1.1 Objective-C中的 ...

  9. 又一个高性能轻量级的iOS模型框架YYModel

    前言 iOS的模型框架其实有很多了,去年研究过Mantle,也了解过JSONModel.MJExtension,最近的项目项目优化的时候,再次考虑,基于轻量级.高性能的考虑,最终选择了YYModel. ...

  10. Android中asset和raw的区别

    :assets 文件夹是存放不进行编译加工的原生文件,即该文件夹里面的文件不会像 xml, java 文件被预编译,可以存放一些图片,html,js, css 等文件.