• Jumony Core 3,真正的HTML引擎,正式版发布


    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管理你所有的程序包。

  • 相关阅读:
    URL编码和Bsae64编码
    在控制台保存下载数据文件方法
    前端下载文件的几种方式
    npm i error:0909006C:PEM routines:get_name:no start line 遇到问题解决
    MapTalks.js 使用小结(三): 各类地图加载
    在线瓦片地图服务资源 总结
    npm webpack 遇到的问题解决方案总结
    MapTalks.js 使用小结(二)
    可拖动的进度条 in vue
    滚动条vue-seamless-scroll的使用
  • 原文地址:https://www.cnblogs.com/Ivony/p/3447536.html
Copyright © 2020-2023  润新知