cheerio
是为服务器特别定制的,快速、灵活的jQuery
核心实现.
安装
npm i cheerio
特点
- 相似的语法:
cheerio
实现了核心jQuery
的子集。cheerio
会从jQuery
库中删除所有DOM
矛盾和浏览器的尴尬部分,展示她真正华丽的API
。 - 非常快:
cheerio
使用一个非常简单的、一致的DOM
模型。作为一个结果分析、处理和呈现的工具非常有效。基础的端到端基准测试显示其速度是JSDOM
的8倍。 - 非常的灵活:
cheerio
基于htmlparser2
。cheerio
可以解析几乎任何HTML
或XML
文档。
使用
首先你需要加载HTML
,jQuery
的这一步是必须的,因为一个jQuery
运行,常用DOM
。在cheerio
中,我们需要把HTML document
传进去。
var cheerio = require('cheerio'),
$ = cheerio.load('<ul id="fruits">...</ul>');
如果你需要修改默认的解析选项你也可以传一个额外的对象给.load()
:
$ = cheerio.load('<ul id="fruits">...</ul>', {
normalizeWhitespace: true,
xmlMode: true
});
这些解析选项直接取自htmlparser2,因此也可以在cheerio
中使用任何在htmlparser2
中有效的选项。默认的选项是:
{
normalizeWhitespace: false,
xmlMode: false,
decodeEntities: true
}
抓取求书网例子
npm i axios cheerio
const axios = require("axios");
const cheerio = require("cheerio");
const baseURL = "http://www.aidusk.org/";
/**
* 获取页面html
* @param {String} url 路径
* @param {Object} params 参数
*/
async function getPage(url = "", params = {}) {
const { data } = await axios({ method: "get", url: baseURL + url, params });
const page = cheerio.load(data);
return page;
}
/**
* 按关键词查询
* @param {String} keyword 关键词
*/
async function search(keyword) {
const $ = await getPage("search.php", { searchkey: keyword });
const listNode = $(".read_list li");
return listNode.toArray().map((item) => {
// 小说封面图
const coverImg = $(item).find(".pic img").attr("src");
const [t1, t2, t3] = $(item).find(".w1").children().get();
// 小说id
const id = $(t1).find(".c1").attr("href").replace(/[^\d]/g, "");
// 小说名
const name = $(t1)
.find(".c1")
.text()
.replace(/[《》]/g, "");
// 小说作者和更新时间
const [author, updateDate] = $(t2)
.text()
.split(" ")
.map((item) => item.split(":")[1]);
// 小说描述
const desc = $(t3).text().replace(/\s/g, "");
return {
id,
name,
coverImg,
desc,
author,
updateDate,
};
});
}
search("天蚕土豆").then((res) => {
console.log(res);
});