【问题标题】:TypeError: $ .find is not a functionTypeError: $ .find 不是函数
【发布时间】:2019-08-04 04:19:27
【问题描述】:

我正在从页面中提取数据,但出现此错误

TypeError: $ .find 不是函数`

我已经安装了cheerio。当我输入trm = $.find(".item-row[data-item='TRM']").find(".item-value > span"); 时出现错误,我得到了数据但出现了这个错误。

代码:

const express = require("express");
const app = express();
const https = require('https');
const cheerio = require('cheerio');

app.get('/', function(req, res) {
  res.send('express test');
});

https.get('https://widgetsdataifx.blob.core.windows.net/semana/semanaindicators', (resp) => {
  let data = '';

  resp.on('data', (chunk) => {
    data += chunk;
  });

  resp.on('end', () => {
    var $ = cheerio.load(data);
    trm = $.find(".item-row[data-item='TRM']").find(".item-value > span");
  });

}).on("error", (err) => {
  console.log("Error: " + err.message);
});

【问题讨论】:

  • @TusharWalzade 这几乎肯定不是问题;错误消息本身非常明显:没有$.find() 方法。可能OP只是想要$(".item-row[data-item='TRM']")
  • @brk 是 Cheerio,一个用于节点抓取应用程序的轻量级 jQuery
  • 也许“数据”不是有效的 HTML 脚手架
  • @TusharWalzade 这是 nodeJS 服务器代码,这里没有 jquery 冲突。 CheerioJS 用于替换 jquery dom 选择器
  • 使用trm = $(".item-row[data-item='TRM'] .item-value > span");是否有效?

标签: javascript html node.js express cheerio


【解决方案1】:

没有$.find() 函数,就像在jQuery 中没有一样。 jQuery 对象上有一个.find() 方法,但这不是$ 所代表的。

trm = $(".item-row[data-item='TRM']").find(".item-value > span");

在加载的标记中搜索“item-row”元素,然后从每个元素中搜索“item-value”元素中的<span>元素。

在“真正的”jQuery 中,$ 对象是一个函数。您对其进行函数调用并传入您希望 Cheerio 在您已加载的 HTML 标记中找到的选择器。

edit — 这是一个工作测试。如果你 npm install cheerio 你可以自己用 Node 试试:

var cheerio = require("cheerio");

var $ = cheerio.load(`<body>
  <div class=item-row data-item=TRM>
    <div class=item-value>
      <span>THIS IS THE CONTENT</span>
    </div>
  </div>
</body>`);


var span = $(".item-row[data-item='TRM']").find(".item-value > span");
console.log(span.text());

【讨论】:

  • @MosèRaguzzini 是的,确实如此,而且您可以清楚地看到它在我发布的代码中被调用。然而,与“真正的”jQuery 一样,它不是 $ 对象上的方法,而是 jQuery 调用返回的对象上的方法。
  • 这个也一样,首先你必须在cheerio中加载数据,然后find()方法在生成的对象上可用
  • @MosèRaguzzini 不,这是不正确的。 $ 代表您调用的函数,用于搜索您使用.load() 加载的DOM。你会通过调用$.find() 来查看网页中的 DOM 吗?另外,您如何解释清楚地表明$.find is not a function 的错误?
  • 在jQuery中可以直接调用utility functions。查看cheerio 文档,我只看到两个实用函数,.find 不是其中之一。
【解决方案2】:

使用代码看起来像var $ = cheerio.load( data ) 表达式将$ 变量分配给加载了HTML 文档的cheerio 实例。然后你可以像使用 jQuery 一样遍历 dom。

将第 20 行更改为

$("body").find(".item-row[data-item='TRM']").find(".item-value > span");

因为我们选择body,然后在原始查询的返回值而不是cheerio 本身的实例上调用find 方法,所以会起作用。

【讨论】:

  • 是的,完全正确。或者只是$(".item-row[data-item='TRM']"),就像网页上的jQuery一样。
  • 你的意思是$(".item-row[data-item='TRM']")? ;)
  • 对不起;错字已修复。
猜你喜欢
  • 2016-08-20
  • 1970-01-01
  • 2023-01-11
  • 1970-01-01
  • 2018-10-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-18
  • 2020-09-12
相关资源
最近更新 更多