cheerio获取outerHTML

cheerio获取outerHTMLcheerio作为node中jquery的替代品,拥有与jquery相似的api,甚至连详细文档的地址都指向api.jquery.com。但是由于执行环境的关系,并没有完全继承jquery中的方法。对于这样的页面<html> <head></head> <body> <ulid=”fruits”> <li>…

大家好,又见面了,我是你们的朋友全栈君。

cheerio作为node中jquery的替代品,拥有与jquery相似的api,甚至连详细文档的地址都指向api.jquery.com。但是由于执行环境的关系,并没有完全继承jquery中的方法。
对于这样的页面

<html>
	<head></head>
	<body>
		<ul id="fruits">
			<li>1</li>
			<li>2</li>
		</ul>
		<ul id="others">
			<li>1</li>
			<li>2</li>
		</ul>
	</body>
</html>

在浏览器中,使用jquery获取所选取对象的包括本身标签的内容时,会用到下面的方法
$("......").prop("outerHTML")
例如若要去取id等于fruits的内容
$("#fruits").prop("outerHTML")

但是这在cheerio中行不通。
网上搜索了一圈后基本都是一套翻译完的文档无限转载。。。还是自己动手写了两个方法。

方法一

var cheerio = require('cheerio');

const $ = cheerio.load('<html><head></head><body><ul id="fruits"><li>1</li><li>2</li></ul><ul id="others"><li>1</li><li>2</li></ul></body></html>');

console.log(cheerio.load('<div></div>')("div").html($("#fruits")).html());

既然它只能获取内容,那就造一个容器把它包进去再取。就是普通的jquery语法不解释。

方法二

改源码
核心的文件有两个。分别是cheerio包下的manipulation.js

exports.html = function(str) { 
   
  if (str === undefined) { 
   
    if (!this[0] || !this[0].children) return null;
    return $.html(this[0].children, this.options);
  }

  var opts = this.options;

  domEach(this, function(i, el) { 
   
    _.forEach(el.children, function(child) { 
   
      child.next = child.prev = child.parent = null;
    });

    var content = str.cheerio ? str.clone().get() : evaluate('' + str, opts, false);

    updateDOM(content, el);
  });

  return this;
};

还有static.js

exports.html = function(dom, options) { 
   

  // be flexible about parameters, sometimes we call html(),
  // with options as only parameter
  // check dom argument for dom element specific properties
  // assume there is no 'length' or 'type' properties in the options object
  if (Object.prototype.toString.call(dom) === '[object Object]' && !options && !('length' in dom) && !('type' in dom))
  { 
   
    options = dom;
    dom = undefined;
  }

  // sometimes $.html() used without preloading html
  // so fallback non existing options to the default ones
  options = _.defaults(flattenOptions(options || { 
   }), this._options, defaultOptions);

  return render(this, dom, options);
};

虽然完全搞不懂nodejs是怎么运行的(纯靠报错和ctrl+f硬找,我自己都意外的是在用断点之前就找到了解决方法),总之,在manipulation.js中添加这段代码

exports.outerHTML = function(str) { 
   
    return $.html(this[0], this.options);
}

然后这样调用也是可以的

var cheerio = require('cheerio');

const $ = cheerio.load('<html><head></head><body><ul id="fruits"><li>1</li><li>2</li></ul><ul id="others"><li>1</li><li>2</li></ul></body></html>');

console.log($("#fruits").outerHTML());

但是,这可能不符合规范,先用方法一凑合着吧。

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 3.1 学习率(learning rate)的选择

    3.1 学习率(learning rate)的选择1.什么是学习率调参的第一步是知道这个参数是什么,它的变化对模型有什么影响。(1)要理解学习率是什么,首先得弄明白神经网络参数更新的机制-梯度下降+反向传播。参考资料:https://www.cnblogs.com/softzrp/p/6718909.html。总结一句话:将输出误差反向传播给网络参数,以此来拟合样本的输出。本质上是最优化的一个过程,逐步趋向于最优解。但是每一次更新参数利用…

    2022年6月11日
    30
  • Kotlin入门(20)几种常见的对话框

    Kotlin入门(20)几种常见的对话框提醒对话框手机上的App极大地方便了人们的生活,很多业务只需用户拇指一点即可轻松办理,然而这也带来了一定的风险,因为有时候用户并非真的想这么做,只是不小心点了一下而已,如果App不做任何提示的话,继续吭哧吭哧兀自办完业务,比如转错钱了、误删资料了,往往令用户追悔莫及。所以对于部分关键业务,App为了避免用户的误操作,很有必要弹出消息对话框,提醒用户是否真的要进行此项操作。这个提醒对话框便是Ap…

    2022年6月22日
    97
  • wpa2 wep_wep wpa wpa2的区别

    wpa2 wep_wep wpa wpa2的区别今天来探究一下WiFi的几种加密方式。从最简单的WEP开始。WEP(WiredEquivalentPrivacy,有线等效保密)WEP加密是最早在无线加密中使用的技术,新的升级程序在设置上和以前有点不同,功能当然比之前丰富一些,下面让我们来看看如何使用WEP。当在无线“基本设置”里面“安全认证类型”选择“自动选择”、“开放系统”、“共享密钥”这三项的时候,使用的就是WEP加密技术,“自动…

    2022年10月26日
    0
  • 外国asp空间常见问题解答[通俗易懂]

    外国asp空间常见问题解答[通俗易懂]现在国内的免费asp空间越来越少,即使是收费的,也有备案的麻烦。所以国外的空间就成了很多人的选择,但是选择国外的空间,往往会有数据库连接、乱码和时差的问题。这里,我参考各位高人的文章,在本地用虚拟机运行英文版WindowsServer2003企业版试验,成功地解决了这些问题,现在就为大家一一道来。数据库连接问题这里我只测试了Access数据库。症状如下:在本地使用数据库很正

    2022年10月26日
    0
  • 优化算法——牛顿法(Newton Method)

    优化算法——牛顿法(Newton Method)一、牛顿法概述

    2022年5月6日
    270
  • 免费的mysql可视化工具_centos7安装oracle

    免费的mysql可视化工具_centos7安装oracle以前安装过几十次的mysql。今天还是遇到问题(虽然是因为是局域网ip不通无法远程连接),记录一个完整的安装过程。1.yum卸载yum安装之后如果需要卸载1.命令rpm-qa|grep-imysql或者yumlistinstalled|grepmysql查看安装的mysql安装包将查出来的安装包通过yumremove卸载yumremovemysql-comm…

    2022年9月23日
    0

发表回复

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

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