cparse
Version:
一个基于 Cheerio 的 HTML 解析和数据提取工具库
185 lines (160 loc) • 5.66 kB
JavaScript
/**
* 网页抓取示例
* 演示如何使用 cparse 进行实际的网页数据抓取
*/
const { loadCheerio, parse } = require('../index.js');
// 模拟一个电商产品页面
const productPageHtml = `
<html>
<head>
<title>商品详情 - 在线商城</title>
</head>
<body>
<div class="product-page">
<div class="breadcrumb">
<a href="/">首页</a> >
<a href="/electronics">电子产品</a> >
<a href="/phones">手机</a> >
<span>iPhone 15 Pro</span>
</div>
<div class="product-info">
<h1 class="product-title">Apple iPhone 15 Pro 128GB 深空黑色</h1>
<div class="price-section">
<span class="current-price">¥7,999.00</span>
<span class="original-price">¥8,999.00</span>
<span class="discount">-11%</span>
</div>
<div class="product-specs">
<div class="spec-item">
<span class="spec-label">存储容量:</span>
<span class="spec-value">128GB</span>
</div>
<div class="spec-item">
<span class="spec-label">颜色:</span>
<span class="spec-value">深空黑色</span>
</div>
<div class="spec-item">
<span class="spec-label">屏幕尺寸:</span>
<span class="spec-value">6.1英寸</span>
</div>
</div>
<div class="rating-section">
<div class="rating" data-score="4.5">
<span class="stars">★★★★☆</span>
<span class="score">4.5</span>
</div>
<span class="review-count">(1,234 条评价)</span>
</div>
<div class="availability">
<span class="stock-status in-stock">现货</span>
<span class="shipping">免费配送</span>
</div>
</div>
<div class="reviews">
<h3>用户评价</h3>
<div class="review-item">
<div class="reviewer">张三</div>
<div class="review-rating" data-score="5">★★★★★</div>
<div class="review-text">非常好的手机,性能强劲,拍照效果很棒!</div>
<div class="review-date">2024-01-15</div>
</div>
<div class="review-item">
<div class="reviewer">李四</div>
<div class="review-rating" data-score="4">★★★★☆</div>
<div class="review-text">整体不错,就是价格有点贵。</div>
<div class="review-date">2024-01-10</div>
</div>
<div class="review-item">
<div class="reviewer">王五</div>
<div class="review-rating" data-score="5">★★★★★</div>
<div class="review-text">苹果的品质一如既往的好,推荐购买!</div>
<div class="review-date">2024-01-08</div>
</div>
</div>
</div>
</body>
</html>
`;
console.log('=== 网页抓取示例 ===\n');
const $ = loadCheerio(productPageHtml);
// 1. 提取基本产品信息
console.log('1. 基本产品信息:');
const basicInfo = parse({
title: '.product-title',
currentPrice: '.current-price | slice:1: | float',
originalPrice: '.original-price | slice:1: | float',
discount: '.discount | slice:1:-1 | int',
inStock: '.stock-status.in-stock | bool'
}, $);
console.log(JSON.stringify(basicInfo, null, 2));
// 2. 提取产品规格
console.log('\n2. 产品规格:');
const specs = parse([
'[.spec-item]',
{
label: '.spec-label | slice:0:-1', // 去掉冒号
value: '.spec-value'
}
], $);
console.log(JSON.stringify(specs, null, 2));
// 3. 提取评分信息
console.log('\n3. 评分信息:');
const rating = parse({
score: '.rating@data-score | float',
reviewCount: '.review-count | slice:1:-4 | int' // 提取数字部分
}, $);
console.log(JSON.stringify(rating, null, 2));
// 4. 提取用户评价
console.log('\n4. 用户评价:');
const reviews = parse([
'[.review-item]',
{
reviewer: '.reviewer',
rating: '.review-rating@data-score | int',
text: '.review-text',
date: '.review-date'
}
], $);
console.log(JSON.stringify(reviews, null, 2));
// 5. 综合产品数据
console.log('\n5. 完整产品数据:');
const productData = parse({
// 基本信息
title: '.product-title',
price: {
current: '.current-price | slice:1: | float',
original: '.original-price | slice:1: | float',
discount: '.discount | slice:1:-1 | int'
},
// 规格参数
specs: [
'[.spec-item]',
{
label: '.spec-label | slice:0:-1',
value: '.spec-value'
}
],
// 评分
rating: {
score: '.rating@data-score | float',
count: '.review-count | slice:1:-4 | int'
},
// 库存状态
availability: {
inStock: '.stock-status.in-stock | bool',
freeShipping: '.shipping | bool'
},
// 评价列表
reviews: [
'[.review-item]',
{
reviewer: '.reviewer',
rating: '.review-rating@data-score | int',
text: '.review-text',
date: '.review-date'
}
]
}, $);
console.log(JSON.stringify(productData, null, 2));
console.log('\n=== 抓取完成 ===');