Jumony Core 3,真正的HTML引擎
Jumony Core 3,真正的HTML引擎,正式版发布
2013-11-28 17:22 by Ivony..., 778 阅读, 18 评论, 收藏, 编辑
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应当解析为< a |
| 孤立的>解析为文本 | <a>></a>应当解析为<a>></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页面,并抽取页面的标题以及简介,形成导航目录和概要页面。
Jumony的生命就在于想象力,你有想象力,Jumony的潜力就是无穷的,没有想象力,这就是个HTML解析器而已。
Jumony项目的初衷是什么?其实Jumony的初衷是解决Web开发的问题!所谓的Jumony Core只是从这个项目中剥离出来的核心部分,也即HTML引擎。
Jumony可以用来做什么?开发网站,我们现在就在用,Jumony是MVC的视图引擎,也支持传统的WebForm模式。现在有人用Jumony来做HTML控件。
Jumony还能做什么?Jumony可以把网页打包成MHT文件,为什么?因为Jumony能找到页面引用的所有的资源并打包到一起。
Jumony 还能做什么?那个帮助文档的网站就是Jumony极有想象力的一个尝试,整个网站只有内容,只有文档,左边的网站导航完全是直接分析网站文件夹和文件结构 自动生成出来的,下面的feedback是个控件,不信直接打开这个地址看看:http://demo.jumony.net/helpentries/quickstart/parser.html
Jumony更能做什么?那取决于你的想象力。
Jumony Core 3,真正的HTML引擎的更多相关文章
- Jumony Core 3,真正的HTML引擎,正式版发布
Jumony是一个开源项目,已经有三年的历史了,在这三年中,秉承提供给.NET程序员完整的HTML掌控能力,Jumony历经无数次的改进,终于进入了一个新的阶段.Jumony Core 3是一个真正意 ...
- Jumony.Core非常厉害的一个开源项目!
简单的说,就是解析html文档的,以前发送一个get请求获取一个页面的html文本后,想要获取里面的数据都是使用正则表达式.(非常的苦逼), 现在用这个获取就very easy! 安装的话在Nu Ge ...
- Core中使用Razor视图引擎渲染视图为字符串 阅读目录
Core中使用Razor视图引擎渲染视图为字符串 } <!DOCTYPE html> <html> <head> <title>Render view ...
- .NET Core中使用Razor模板引擎
一.简介 在MVC以外的场景中,我们往往需要完成一些模板引擎生成代码或页面的工作:在以前我们一般常用的有Razor.NVeocity.VTemplate.虽然所有的模板系统都具有一些共同特征,但 Ra ...
- ASP.NET Core中使用Razor视图引擎渲染视图为字符串
一.前言 在有些项目需求上或许需要根据模板生产静态页面,那么你一样可以用Razor语法去直接解析你的页面从而把解析的页面生成静态页,这样的使用场景很多,不限于生成静态页面,视图引擎为我们提供了模型到视 ...
- ASP.NET Core中使用Razor视图引擎渲染视图为字符串(转)
一.视图渲染说明 在有些项目需求上或许需要根据模板生产静态页面,那么你一样可以用Razor语法去直接解析你的页面从而把解析的页面生成静态页,这样的使用场景很多,不限于生成静态页面,视图引擎为我们提供了 ...
- 一个适合于.NET Core的超轻量级工作流引擎:Workflow-Core
一.关于Workflow-Core 近期工作上有一个工作流的开发需求,自己基于面向对象和职责链模式捣鼓了一套小框架,后来在github上发现一个轻量级的工作流引擎轮子:Workflow-Core,看完 ...
- HTML解析引擎:Jumony 开源项目
Jumony Core首先提供了一个近乎完美的HTML解析引擎,其解析结果无限逼近浏览器的解析结果.不论是无结束标签的元素,可选结束标签的元素,或是标记属性,或是CSS选择器和样式,一切合法的,不合法 ...
- HTML解析引擎:Jumony
Jumony Core首先提供了一个近乎完美的HTML解析引擎,其解析结果无限逼近浏览器的解析结果.不论是无结束标签的元素,可选结束标签的元素,或是标记属性,或是CSS选择器和样式,一切合法的,不合法 ...
随机推荐
- Linux互斥和同步应用程序(一):posix线程和线程之间的相互排斥
[版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet 或 .../gentleliu,文章仅供学习交流.请勿用于商业用途] 有了进程的概念,为何还要使用线程呢? 首先,回 ...
- Find a way (BFS)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2612 BFS搜索 目标地 并记录下来 之后再判断两段路程之和 代码: #include < ...
- ABP领域层——实体
ABP领域层——实体 基于DDD的现代ASP.NET开发框架--ABP系列之10.ABP领域层——实体 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的 ...
- bigdata_ambari修改hiveserver_metastore链接库(从0.14 升级到1.2.1 )
第一步:[db升级 ,先看第二步] cd到 hive的 metastore upgrade目录 cd /usr/hdp/2.5.0.0-1245/hive/scripts/metastore/upg ...
- 多线程相互排斥--mutex(二)
不知道大家对多线程或多进程间的同步相互排斥的控制机制了解的怎么样,事实上有非常多种方法能够实现这个目的,可是这些方法事实上由4种最主要的方法实现.这4种最主要的方法详细定义例如以下:在这有讲得不正确的 ...
- VS2013打包部署(图解)
首先要说明的是VS解决方案的配置Debug模式和Release有什么区别模式.Debug模式通常被称为调试模式,它包括调试信息,不优化的代码,序:Release模式通常叫做公布模式.不包括调试信息,可 ...
- EF中的贪婪加载和延迟加载(懒加载)
在上一章中,我们使用了Linq对Entity Framework进行了一个查询,但是通过学习我们却发现了懒加载给我来的性能上的开销是很到的,尤其是在循环中,如果数据量不是很多的情况下还可以接受,如果数 ...
- jsp的<%%>
于jsp于 可以使用<% %> 嵌入java代码,简称jsp文字. 可以使用<% -- -- %> 凝视,这是jsp注视 可以使用<%! %> 声明全局变量 版权声 ...
- CQRS(命令查询职责分离)和 EDA(事件驱动架构)
转载CQRS(命令查询职责分离)和 EDA(事件驱动架构) 上一篇:<IDDD 实现领域驱动设计-SOA.REST 和六边形架构> 阅读目录: CQRS-命令查询职责分离 EDA-事件驱动 ...
- Host和Server的开发
Host和Server的开发 对于开发人员来说,代码就是最好的文档,如上一篇博文所说,下面我们就会基于Kanata项目的一些具体调用代码,来进一步深入理解OWIN的实现和作用. 今天我们先针对Host ...