帮酷LOGO
  • 显示原文与译文双语对照的内容
Parses HTML strings into objects using flexible, composable filters.

  • 源代码名称:node-html-to-json
  • 源代码网址:http://www.github.com/prolificinteractive/node-html-to-json
  • node-html-to-json源代码文档
  • node-html-to-json源代码下载
  • Git URL:
    git://www.github.com/prolificinteractive/node-html-to-json.git
  • Git Clone代码到本地:
    git clone http://www.github.com/prolificinteractive/node-html-to-json
  • Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/prolificinteractive/node-html-to-json
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
  • HTML to JSON

    使用灵活的可以组合过滤器将HTML字符串解析为对象。

    安装

    npm install html-to-json

    htmlToJson.parse(html, filter, [callback] ) -> 承诺

    parse() 方法接受一个HTML字符串和一个过滤器,并使用过滤后的数据响应。 这同时支持回调和承诺。

    var promise =htmlToJson.parse('<div>content</div>', {
     'text':function ($doc) {
     return$doc.find('div').text();
     }
    }, function (err, result) {
     console.log(result);
    });promise.done(function (result) {
     //Works as well});

    htmlToJson.request(requestOptions, filter, [callback] ) -> 承诺

    request() 方法接受对请求库和筛选器的调用,然后返回过滤后的响应主体。

    var promise =htmlToJson.request('http://prolificinteractive.com/team', {
     'images': ['img', function ($img) {
     return$img.attr('src');
     }]
    }, function (err, result) {
     console.log(result);
    });

    htmlToJson.batch(html, dictionary, [callback] ) -> 承诺

    对一个HTML字符串执行许多解析操作。 这将HTML转换成一次 DOM,而不是用于字典中的每个过滤器,这可以以快速地获得成本。 这也允许你将过滤器分解成更细粒度的成分,并将它们混合在一起。

    字典中的值可以是 htmlToJson.Parser 对象。htmlToJson.createMethod 生成的方法或者你通常可以传递到 htmlToJson.parse的裸过滤器。 例如:

    returngetProlificHomepage().then(function (html) {
     returnhtmlToJson.batch(html, {
     sections:htmlToJson.createParser(['#primary-nav a', {
     'name':function ($section) {
     return$section.text();
     },
     'link':function ($section) {
     return$section.attr('href');
     }
     }]),
     offices:htmlToJson.createMethod(['.office', {
     'location':function ($office) {
     return$office.find('.location').text();
     },
     'phone':function ($office) {
     return$office.find('.phone').text();
     }
     }]),
     socialInfo: ['#footer. social-link', {
     'name':function ($link) {
     return$link.text();
     },
     'link':function ($link) {
     return$link.attr('href');
     }
     }]
     });
    });

    htmlToJson.createMethod(filter) -> 函数( html,[callback] )

    生成包装传递的filter 参数的方法。 方法接受一个HTML字符串并对它的进行处理。

    var parseFoo =htmlToJson.createMethod({
     'foo':function ($doc) {
     return$doc.find('#foo').bar();
     }
    });

    htmlToJson.createParser(filter), 新 htmlToJson.Parser(filter )

    为了便于重用,使用 .parse.request helper 方法创建了一个对象,该对象使用了经过。 例如:

    var linkParser =htmlToJson.createParser(['a[href]', {
     'text':function ($a) {
     return$a.text();
     },
     'href':function ($a) {
     return$a.attr('href');
     }
    }]);linkParser.request('http://prolificinteractive.com').done(function (links) {
     //Do stuff with links});

    等效于:

    linkParser.request('http://prolificinteractive.com', ['a[href]', {
     'text':function ($a) {
     return$a.text();
     },
     'href':function ($a) {
     return$a.attr('href');
     }
    }]).done(function (links) {
     //Do stuff with links});

    前者允许你轻松重用过滤器( 让它变得可以测试),而后者则是一个。

    parser.parse(html, [callback] )

    根据解析器的筛选器解析传递的html参数。

    parser.method(html, [callback] )

    返回包装 parser.parse()的方法

    parser.request(requestOptions, [callback] )

    使用请求选项发出请求,然后通过解析器的筛选器运行响应主体。

    筛选器类型

    用户定义函数

    函数的返回值根据对应的键映射。 函数过滤器被传递给 cheerio 对象,这样你就可以使用像接口一样的。

    htmlToJson.parse('<div id="foo">foo</div>', {
     'foo1':function ($doc, $) {
     return$doc.find('#foo').text(); //foo }
    }, callback);

    数组

    可以通过在筛选函数中使用. map() 方法或者使用 shorthand [selector, filter] 语法来解析数据数组:

    . map(selector, filter )

    对每个匹配元素递增应用筛选器,并在 array 中返回结果。

    var html ='<div id="items"><div class="item">1</div><div class="item">2</div></div>';htmlToJson.parse(html, function () {
     returnthis.map('.item', function ($item) {
     return$item.text();
     });
    }).done(function (items) {
     // Items should be: ['1','2']}, function (err) {
     // Handle error});
    [selector, filter, after ]

    这实际上是 .map()的shorthand 别名,使筛选器看起来更像它的输出:

    var html ='<div id="items"><div class="item">1</div><div class="item">2</div></div>';
    htmlToJson
    . parse(html, ['.item', function ($item) {
     return$item.text();
     }])
    . done(function (items) {
     // Items should be: ['1','2'] }, function (err) {
     // Handle error });

    你可以以将 3rd 个参数传递到 array 过滤器中,这样你就可以以操作结果了。 如果你希望执行异步操作,你可以返回一个 promise 。

    var html ='<div id="items"><div class="item">1</div><div class="item">2</div></div>';
    htmlToJson
    . parse(html, ['.item', function ($item) {
     return+$item.text();
     }, function (items) {
     return_.map(items, function (item) {
     return item *3;
     });
     }])
    . done(function (items) {
     // Items should be: [3,6] }, function (err) {
     // Handle error });

    异步滤波器

    Filter函数还可以返回承诺,这是异步解析的。

    functiongetProductDetails (id, callback) {
     returnhtmlToJson.request({
     uri:'http://store.prolificinteractive.com/products/'+ id
     }, {
     'id':function ($doc) {
     return$doc.find('#product-details').attr('data-id');
     },
     'colors': ['.color', {
     'id':function ($color) {
     return$color.attr('data-id');
     },
     'hex':function ($color) {
     return$color.css('background-color');
     }
     }]
     }, callback);
    }functiongetProducts (callback) {
     returnhtmlToJson.request({
     uri:'http://store.prolificinteractive.com' }, ['.product', {
     'id':function ($product) {
     return$product.attr('data-id');
     },
     'image':function ($product) {
     return$product.find('img').attr('src');
     },
     'colors':function ($product) {
     // This is where we use a promise to get the colors asynchronouslyreturnthis. get('id')
    . then(function (id) {
     returngetProductDetails(id).get('colors');
     });
     }
     }], callback);
    }

    对其他值的依赖关系

    Filter函数可以使用 .get(propertyName) 来使用来自该筛选器中另一个键的值。 这将返回一个表示值而不是值本身的promise 。

    functiongetProducts (callback) {
     returnhtmlToJson.request('http://store.prolificinteractive.com', ['.product', {
     'id':function ($product) {
     return$product.attr('data-id');
     },
     'image':function ($product) {
     return$product.find('img').attr('src');
     },
     'colors':function ($product) {
     // Resolve 'id' then get product details with itreturnthis. get('id')
    . then(function (id) {
     returngetProductDetails(id).get('colors');
     });
     }
     }], callback);
    }

    对象

    过滤器内的嵌套对象与父筛选器在相同的HTML上下文中运行。

    var html ='<div id="foo"><div id="bar">foobar</div></div>';htmlToJson.parse(html, {
     'foo': {
     'bar':function ($doc) {
     return$doc.find('#bar').text();
     }
     }
    });
    $container 修饰符

    可以通过在对象过滤器上设置 $container 属性来指定更具体的DOM上下文:

    var html ='<div id="foo"><div id="bar">foobar</div></div>';htmlToJson.parse(html, {
     'foo': {
     $container:'#foo',
     'bar':function ($foo) {
     return$foo.find('#bar').text();
     }
     }
    });

    常数

    字符串。数字和空值仅用作筛选器的值。 这特别有助于从模拟数据增量转换为已经解析数据。

    htmlToJson.parse('<div id="nada"></div>', {
     x:1,
     y:'string value',
     z:null});

    运行测试

    测试是用 mocha 编写的,位于 test 目录中。 运行它们:

    npm test

    这里脚本还针对 lib/test/ 目录执行 jshint

    样式

    请阅读现有代码以了解约定。




    Copyright © 2011 HelpLib All rights reserved.    知识分享协议 京ICP备05059198号-3  |  如果智培  |  酷兔英语