zoukankan      html  css  js  c++  java
  • 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应当解析为&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页面,并抽取页面的标题以及简介,形成导航目录和概要页面。


    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更能做什么?那取决于你的想象力

     
     
    分类: .NETC#
  • 相关阅读:
    C. Shaass and Lights 解析(思維、組合)
    D. Binary String To Subsequences(队列)(贪心)
    CodeForces 1384B2. Koa and the Beach (Hard Version)(贪心)
    CodeForces 1384B1. Koa and the Beach (Easy Version)(搜索)
    CodeForces 1384C. String Transformation 1(贪心)(并查集)
    CodeForces 1384A. Common Prefixes
    POJ-2516 Minimum Cost(最小费用最大流)
    POJ3261-Milk Patterns(后缀数组)
    HDU-1300 Pearls(斜率DP)
    HDU-4528 小明系列故事-捉迷藏(BFS)
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3448600.html
Copyright © 2011-2022 走看看