cparse
Version:
一个基于 Cheerio 的 HTML 解析和数据提取工具库
190 lines (165 loc) • 5.92 kB
JavaScript
/**
* 语法对比演示
* 展示传统语法 vs 简化语法的差异
*/
const { loadCheerio, parse } = require('../index.js');
// 示例 HTML
const html = `
<!DOCTYPE html>
<html>
<head>
<title>语法对比演示</title>
</head>
<body>
<div class="container">
<h1 class="title">cparse 语法对比</h1>
<p class="description">展示传统语法与简化语法的差异</p>
<div class="product-list">
<div class="product" data-id="1">
<h3 class="name">iPhone 15</h3>
<span class="price">$999.00</span>
<div class="rating" data-score="4.5">★★★★☆</div>
<div class="tags">
<span class="tag">手机</span>
<span class="tag">苹果</span>
<span class="tag">5G</span>
</div>
</div>
<div class="product" data-id="2">
<h3 class="name">MacBook Pro</h3>
<span class="price">$1999.00</span>
<div class="rating" data-score="4.8">★★★★★</div>
<div class="tags">
<span class="tag">笔记本</span>
<span class="tag">苹果</span>
<span class="tag">M3</span>
</div>
</div>
</div>
<div class="stats">
<span class="total-products">2</span>
<span class="avg-rating">4.65</span>
</div>
</div>
</body>
</html>
`;
const $ = loadCheerio(html);
console.log('=== cparse 语法对比演示 ===\n');
// 1. 基本选择器对比
console.log('1. 基本选择器对比:');
console.log('传统语法: parse(\'.title\', $)');
console.log('简化语法: $.parse(\'.title\')');
console.log('结果:', $.parse('.title'));
console.log('');
// 2. 属性提取对比
console.log('2. 属性提取对比:');
console.log('传统语法: parse(\'[.product@data-id]\', $)');
console.log('简化语法: $.parse(\'[.product@data-id]\')');
console.log('结果:', $.parse('[.product@data-id]'));
console.log('');
// 3. 过滤器链对比
console.log('3. 过滤器链对比:');
console.log('传统语法: parse(\'.price | regex:\\\\d+\\\\.\\\\d+ | float\', $)');
console.log('简化语法: $.parse(\'.price | regex:\\\\d+\\\\.\\\\d+ | float\')');
console.log('结果:', $.parse('.price | regex:\\d+\\.\\d+ | float'));
console.log('');
// 4. 数组提取对比
console.log('4. 数组提取对比:');
console.log('传统语法: parse(\'[.tag]\', $)');
console.log('简化语法: $.parse(\'[.tag]\')');
console.log('结果:', $.parse('[.tag]'));
console.log('');
// 5. 结构化数据对比
console.log('5. 结构化数据对比:');
console.log('传统语法:');
console.log('parse({');
console.log(' title: \'.title\',');
console.log(' products: \'[.product]\',');
console.log(' totalProducts: \'.total-products | int\'');
console.log('}, $)');
console.log('');
console.log('简化语法:');
console.log('$.parse({');
console.log(' title: \'.title\',');
console.log(' products: \'[.product]\',');
console.log(' totalProducts: \'.total-products | int\'');
console.log('})');
console.log('');
const basicData = $.parse({
title: '.title',
products: '[.product .name]',
totalProducts: '.total-products | int'
});
console.log('结果:', JSON.stringify(basicData, null, 2));
console.log('');
// 6. 复杂结构化数据对比
console.log('6. 复杂结构化数据对比:');
console.log('使用分割器语法提取产品详情...');
// 传统语法(仍然支持)
const traditionalResult = parse([
'.product',
{
id: '@data-id | int',
name: '.name',
price: '.price | regex:\\d+\\.\\d+ | float',
rating: '.rating@data-score | float',
tags: ['.tags .tag', 'text']
}
], $);
// 简化语法
const simplifiedResult = $.parse([
'.product',
{
id: '@data-id | int',
name: '.name',
price: '.price | regex:\\d+\\.\\d+ | float',
rating: '.rating@data-score | float',
tags: ['.tags .tag', 'text']
}
]);
console.log('传统语法结果:', JSON.stringify(traditionalResult, null, 2));
console.log('');
console.log('简化语法结果:', JSON.stringify(simplifiedResult, null, 2));
console.log('');
// 7. 性能对比
console.log('7. 性能对比:');
const iterations = 1000;
// 传统语法性能测试
console.time('传统语法性能');
for (let i = 0; i < iterations; i++) {
parse('.title', $);
parse('[.product .name]', $);
parse('.price | float', $);
}
console.timeEnd('传统语法性能');
// 简化语法性能测试
console.time('简化语法性能');
for (let i = 0; i < iterations; i++) {
$.parse('.title');
$.parse('[.product .name]');
$.parse('.price | float');
}
console.timeEnd('简化语法性能');
console.log('');
// 8. 代码简洁性对比
console.log('8. 代码简洁性对比:');
console.log('');
console.log('❌ 传统语法 - 需要重复传递 $ 参数:');
console.log('const title = parse(\'.title\', $);');
console.log('const products = parse(\'[.product .name]\', $);');
console.log('const prices = parse(\'[.price | float]\', $);');
console.log('const data = parse({ title: \'.title\', count: \'.count | int\' }, $);');
console.log('');
console.log('✅ 简化语法 - 更简洁直观:');
console.log('const title = $.parse(\'.title\');');
console.log('const products = $.parse(\'[.product .name]\');');
console.log('const prices = $.parse(\'[.price | float]\');');
console.log('const data = $.parse({ title: \'.title\', count: \'.count | int\' });');
console.log('\n=== 演示完成 ===');
console.log('\n💡 总结:');
console.log('- 简化语法减少了重复的 $ 参数传递');
console.log('- 代码更简洁、更直观');
console.log('- 性能基本相同');
console.log('- 完全向后兼容,传统语法仍然支持');
console.log('- 推荐在新项目中使用简化语法');