🎯 核心概念
1. 加载 HTML
const cheerio = require('cheerio');
const $ = cheerio.load(html, {
decodeEntities: false, // 是否解码实体,默认为 true
xmlMode: false, // XML 模式,默认为 false
});
2. 选择器类型
// CSS 选择器
$('div.class') // 类选择器
$('div#id') // ID 选择器
$('div[data-value]') // 属性选择器
$('parent > child') // 子选择器
$('div:first-child') // 伪类选择器
// 自定义筛选
$('div').filter((i, el) => $(el).text().includes('文本'))
$('div').find('span') // 后代查找
$('div').children() // 直接子元素
🔍 精准查找技巧
1. 避免文本匹配污染
// ❌ 错误:可能匹配到父元素
$("div").filter((_, el) => $(el).text().trim() === "目标文本")
// ✅ 正确:确保是直接文本
$("div").filter((_, el) => {
const $el = $(el);
// 检查元素是否直接包含文本(没有子元素)
return $el.children().length === 0 && $el.text().trim() === "目标文本";
})
// ✅ 使用 :contains 配合检查
$("div:contains('目标文本')").filter((_, el) => {
return $(el).children().length === 0;
})
2. DOM 遍历方法
const $element = $('.target');
// 向上查找
$element.parent() // 直接父元素
$element.parents('.container') // 所有祖先元素中匹配选择器的
$element.closest('.wrapper') // 最近的匹配祖先
// 向下查找
$element.children('.child') // 直接子元素
$element.find('.descendant') // 所有后代元素
// 同级查找
$element.next() // 下一个兄弟
$element.nextAll('.sibling') // 后面所有兄弟
$element.prev() // 上一个兄弟
$element.prevAll('.sibling') // 前面所有兄弟
$element.siblings() // 所有兄弟元素
🛠 数据提取技巧
1. 属性提取
// 获取属性
const href = $('a').attr('href');
const data = $('div').data('value'); // data-value 属性
// 获取所有属性
const attrs = $('div').attr();
Object.keys(attrs).forEach(key => {
if (key.startsWith('data-')) {
console.log(`数据属性 ${key}: ${attrs[key]}`);
}
});
// 获取多个元素的属性
const links = $('a').map((i, el) => $(el).attr('href')).get();
2. 文本提取
// 获取元素文本
const text = $('div').text(); // 包含子元素文本
const ownText = $('div').contents() // 只获取直接文本
.filter((_, node) => node.type === 'text')
.text();
// 获取多个元素文本
const texts = $('li').map((i, el) => $(el).text().trim()).get();
// 获取 HTML
const html = $('div').html(); // 内部 HTML
const outerHtml = $.html($('div')); // 外层 HTML
🎨 操作 DOM
1. 修改内容
// 设置内容
$('div').text('新文本'); // 设置文本
$('div').html('<span>新HTML</span>'); // 设置HTML
// 添加内容
$('div').append('<span>追加</span>'); // 内部末尾
$('div').prepend('<span>前插</span>'); // 内部开头
$('div').after('<div>之后</div>'); // 元素之后
$('div').before('<div>之前</div>'); // 元素之前
// 替换元素
$('div').replaceWith('<p>替换</p>');
2. 操作类和属性
// 类操作
$('div').addClass('new-class');
$('div').removeClass('old-class');
$('div').toggleClass('active');
$('div').hasClass('target'); // 返回布尔值
// 属性操作
$('div').attr('title', '新标题'); // 设置
$('div').removeAttr('data-old'); // 删除