cheerio 笔记

cheerio 笔记简介 cheerio 是一个 node 的库 可以理解为一个 Node js 版本的 jquery 用来从网页中以 cssselector 取数据 使用方式和 jquery 基本相同 npminstallch require cheerio var cheerio load lt h2class title gt Hellowo

简介

cheerio是一个node的库,可以理解为一个Node.js版本的jquery,用来从网页中以 css selector取数据,使用方式和jquery基本相同。

npm install cheerio --save

var cheerio = require('cheerio')
var $ = cheerio.load('<h2 class="title">Hello world</h2>')

$('h2.title').text('Hello there!')
$('h2').addClass('welcome')

$.html()
//=> <h2 class="title welcome">Hello there!</h2>
复制代码

可以看出Cheerio 与jquery拥有相似的语法。事实上,Cheerio 从jQuery库中去除了所有 DOM不一致性和浏览器尴尬的部分,性能更优。

load 装载DOM

首先你需要加载HTML。这一步对jQuery来说是必须的,通过Cheerio,我们需要把HTML document 传进去,下面的代码都针对如下代码

var html = '<ul id="fruits"> <li class="apple">Apple</li> <li class="orange">Orange</li> <li class="pear">Pear</li> </ul>'
//DOM结构如下
<ul id="fruits">
  <li class="apple">Apple</li>
  <li class="orange">Orange</li>
  <li class="pear">Pear</li>
</ul>

var cheerio = require('cheerio'),
$ = cheerio.load(html);
复制代码

选择器

$(selectior,[context],[root]) 复制代码

选择器在 Context 范围内搜索,Context又在Root范围内搜索。注意:这里是root在右,context在左。selector 和context可以是一个字符串表达式,DOM元素,和DOM元素的数组,或者chreeio对象。root 是通常是HTML 文档字符串。

$('.apple', '#fruits').text()
//=> Apple
//id为fruits,class为apple的元素,先root后context

$('ul .pear').attr('class')
//=> pear
//class为pear的ul元素

$('li[class=orange]').html()
//=> Orange
//class属性为orange的li元素
复制代码

 attr()修改属性

attr(name,value) 复制代码

获得和修改属性。在匹配的元素中只能获得第一元素的属性。如果设置一个属性的值为null,则移除这个属性。你也可以传递一对键值,或者一个函数。

$('ul').attr('id')
//=> fruits

$('.apple').attr('id', 'favorite').html()
//=> <li class="apple" id="favorite">Apple</li>

$('.apple').attr('class', 'favorite').html()
//=> <li class="favorite">Apple</li>
复制代码

removeAttr(name)

通过name删除属性 $(‘.pear’).removeAttr(‘class’).html() //=> pear

 prop()修改状态值

$('input[type="checkbox"]').prop('checked') //=> false $('input[type="checkbox"]').prop('checked', true).val() //=> ok 复制代码

data()自定义属性

$('<div data-apple-color="red"></div>').data() //=> { appleColor: 'red' } $('<div data-apple-color="red"></div>').data('apple-color') //=> 'red' var apple = $('.apple').data('kind', 'mac') apple.data('kind') //=> 'mac' 复制代码

val()赋值

$('input[type="text"]').val()
//=> input_text

$('input[type="text"]').val('test').html()
//=> <input type="text" value="test"/>
复制代码

hasClass( className )

检查匹配的元素是否有给出的类名

$('.pear').hasClass('pear')//=> true $('apple').hasClass('fruit')//=> false $('li').hasClass('pear')//=> true 复制代码

addClass(name)

增加class(es)给所有匹配的elements.也可以传函数。

$('.pear').addClass('fruit').html()//=> <li class="pear fruit">Pear</li>
$('.apple').addClass('fruit red').html()//=> <li class="apple fruit red">Apple</li>
复制代码

removeClass([className])

从选择的elements里去除一个或多个有空格分开的class。如果className 没有定义,所有的classes将会被去除,也可以传函数

$('.pear').removeClass('pear').html()//=>Pear
$('.apple').addClass('red').removeClass().html()//=>Apple
复制代码

查询语法

find(selector)

获得一个在匹配的元素中由选择器滤过的后代

$('#fruits').find('li').length//=> 3 复制代码

parent([selector])

获得通过选择器筛选匹配的元素的parent集合

$('.orange').parents().length// => 2 $('.orange').parents('#fruits').length// => 1 复制代码

next()获得第一个本元素之后的同级元素

$('.apple').next().hasClass('orange')//=> true
$('.pear').next().html()//=> null
复制代码

.nextAll()

获得本元素之后的所有同级元素 $(‘.apple’).nextAll()//=> [

Orange, Pear]

$(‘.apple’).nextAll().length//=>2

prev() 获得本元素之前的第一个同级元素 $(‘.orange’).prev().hasClass(‘apple’)//=> true

preAll()

获得本元素前的所有同级元素 $(‘.pear’).prevAll()//=> [

Orange, Apple]

 slice(start,[end]) 获得选定范围内的元素数组 $(‘li’).slice(1).eq(0).text()//=> ‘Orange’ $(‘li’).slice(1, 2).length//=> 1

siblings(selector)

获得被选择的同级元素(除去自己) $(‘.pear’).siblings().length//=> 2 $(‘.pear’).siblings(‘.orange’).length//=> 1 $(‘.pear’).siblings(‘.pear’).length//=> 0

first()

会选择chreeio对象的第一个元素 (‘#fruits’).children().first().text()//=> Apple

last()

会选择chreeio对象的最后一个元素 $(‘#fruits’).children().last().text()//=> Pear

eq(i)

通过索引筛选匹配的元素。使用.eq(-i)就从最后一个元素向前数。 $(‘li’).eq(0).text()//=> Apple $(‘li’).eq(-1).text()//=> Pear

children(selector)

获被选择元素的子元素 $(‘#fruits’).children().length//=> 3 $(‘#fruits’).children(‘.pear’).text()//=> Pear

each(function(index,element))

迭代一个cheerio对象,为每个匹配元素执行一个函数。要提早跳出循环,返回false.

var fruits = []; $('li').each(function(i, elem) { fruits[i] = $(this).text(); }); fruits.join(', '); //=> Apple, Orange, Pear 复制代码

map(function(index,element))

迭代一个cheerio对象,为每个匹配元素执行一个函数。Map会返回一个迭代结果的数组。

$('li').map(function(i, el) { return $(this).attr('class'); }).join(', '); //=> apple, orange, pear 复制代码

filter(selector)

迭代一个cheerio对象,滤出匹配选择器或者是传进去的函数的元素。如果使用函数方法,这个函数在被选择的元素中执行,所以this指向的手势当前元素。

$('li').filter('.orange').attr('class');//=> orange $('li').filter(function(i, el) { // this === el return $(this).attr('class') === 'orange'; }).attr('class') //=> orange 复制代码

改变DOM结构的方法

append(content,[content…])

在每个元素最后插入一个子元素

$('ul').append('<li class="plum">Plum</li>')
$.html()
//=>
// <li class="apple">Apple</li>
// <li class="orange">Orange</li>
// <li class="pear">Pear</li>
// <li class="plum">Plum</li>//
复制代码

prepend(content,[content,…])

在每个元素最前插入一个子元素

$('ul').prepend('<li class="plum">Plum</li>')
$.html()
//=>
// <li class="plum">Plum</li>
// <li class="apple">Apple</li>
// <li class="orange">Orange</li>
// <li class="pear">Pear</li>
复制代码

after(content,[content,…])

在每个匹配元素之后插入一个元素

$('.apple').after('<li class="plum">Plum</li>')
$.html()
//=>
// <li class="apple">Apple</li>
// <li class="plum">Plum</li>
// <li class="orange">Orange</li>
// <li class="pear">Pear</li>
复制代码

before(content,[content,…])

在每个匹配的元素之前插入一个元素

$('.apple').before('<li class="plum">Plum</li>')
$.html()
//=>
// <li class="plum">Plum</li>
// <li class="apple">Apple</li>
// <li class="orange">Orange</li>
// <li class="pear">Pear</li>
复制代码

remove( [selector] )

从DOM中去除匹配的元素和它们的子元素。选择器用来筛选要删除的元素。

$('.pear').remove()
$.html()//=>

// <li class="apple">Apple</li>
// <li class="orange">Orange</li>
复制代码

replaceWith( content )

替换匹配的的元素

var plum = $('<li class="plum">Plum</li>')
$('.pear').replaceWith(plum)
$.html()
//=>
// <li class="apple">Apple</li>
// <li class="orange">Orange</li>
// <li class="plum">Plum</li>//
复制代码

empty()

清空一个元素,移除所有的子元素

$('ul').empty()$.html()
复制代码

html( [htmlString] )

获得元素的HTML字符串。如果htmlString有内容的话,将会替代原来的HTML

$('.orange').html()
//=> Orange
$('#fruits').html('<li class="mango">Mango</li>').html()
//=> <li class="mango">Mango</li>
复制代码

text( [textString] )

获得元素的text内容,包括子元素。如果textString被指定的话,每个元素的text内容都会被替换。

$('.orange').text()//=> Orange $('ul').text()//=> Apple// Orange// Pear 复制代码

cheerio 实践

下载类

var http = require("http"); function download(url, callback) { http.get(url, function(res) { var data = ""; res.on('data', function (chunk) { data += chunk; }); res.on("end", function() { callback(data); }); }).on("error", function() { callback(null); }); } exports.download = download; 复制代码

下载类的使用

var cheerio = require("cheerio"); var loadUrl = require("./loadUrl"); var url = "http://www.example.com" loadUrl.download(url, function(data) {console.log(data);}); 复制代码


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/231807.html原文链接:https://javaforall.net

(0)
上一篇 2025年11月20日 上午11:01
下一篇 2025年11月20日 上午11:22


相关推荐

  • 数据库服务器系统,数据库服务器的操作系统

    数据库服务器系统,数据库服务器的操作系统

    2021年11月28日
    45
  • c++图形界面开发_在界面用显示时间的步骤

    c++图形界面开发_在界面用显示时间的步骤BCGControlBarLibraryProfessionalEdition installation:整个库的源代码安装在\BCGCBPro目录下面.可执行文件(*.dll)安装在\Bin(forVisualStudio6.0)或\Bin7(forVisualStudio.NET)下面。请在你的源代码中做如下的改变:·                    

    2022年10月8日
    5
  • java递归和迭代的区别

    java递归和迭代的区别出现栈的溢出.而迭代不会!  递归的基本概念:程序调用自身的编程技巧称为递归,是函数自己调用自己.一个函数在其定义中直接或间接调用自身的一种方法,它通常把一个大型的复杂的问题转化为一个与原问题相似的规模较小的问题来解决,可以极大的减少代码量.递归的能力在于用有限的语句来定义对象的无限集合.使用递归要注意的有两点:1)递归就是在过程或函数里面调用自身;2)在使用递归时,必须有一个明确的递归结束条件,称为递归出口. 递归分为两个阶段:1)递推:把复杂的问题的求解推到比原问

    2022年5月5日
    50
  • linux查看端口号命令

    linux查看端口号命令这本阿里 P8 撰写的算法笔记 再次推荐给大家 身边不少朋友学完这本书最后加入大厂 Github 疯传 史上最强悍 阿里大佬 LeetCode 刷题手册 开放下载了 第一种 lsof i 端口号第二种 netstat nltp grep 端口号 a 显示本机所有连接和监听地端口 n 网络 IP 地址的形式 显示当前建立的有效连接和端口 r 显示路由表信息 s 显示按协议的统计信息 v 显示当前有效的连接 t 显示所有 TCP 协议连接情况 u 显示所有 UDP 协议连接情况 i 显示自

    2025年8月11日
    6
  • 前端优化方法大全

    前端优化方法大全前端优化方法大全

    2026年3月19日
    2
  • java枚举类型enum用法_java枚举类型enum用法和原理介绍【传智播客】

    java枚举类型enum用法_java枚举类型enum用法和原理介绍【传智播客】Enum 枚举类型 Enum 的全写是 Enumeration 这个词的翻译是列举 逐条陈述 细目 在程序语言中 枚举类型是一种特殊的数据类型 常用的数据类型比如字符串 整型 这种数据类型的变量值限定在固定的范围 比如季节只有春夏秋冬 月份是 12 个 Java 中的枚举枚举前时代在 Java 语言中 枚举类型从 JDK1 5 才开始提供 在这之前使用接口静态常量来实现相关功能 也可以是类静态常量 以季节为例

    2026年3月17日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号