html 使用cheerio在没有子项的父项中获取文本

hc2pp10m  于 2022-11-27  发布在  其他
关注(0)|答案(4)|浏览(175)

我尝试使用cheerio只提取div的内容--不包含该div的任何子项。如果我只使用div.text()--我将获得所有文本--父项和子项。下面是HTML --我只需要值“5.25”
下面的代码当前返回“购买价格$5.25”
HTML如下图:

<div class="outer tile"> 
    < ... various other html here > 
    <div class="cost">
        <span class="text">Purchase price </span>
        <small>$</small>5.25
    </div>
</div>

相关node.js CHEERIO代码摘录如下:

var $ = cheerio.load(data);
$("div.outer.tile").each(function(i, e) {
  var price = $(e).find('div.price');
      console.log(price.text());
});
zi8p0yeb

zi8p0yeb1#

任何人仍然想知道如何在Cheerio中做到这一点:

$('div.classname').first().contents().filter(function() {
    return this.type === 'text';
}).text();
kxkpmulp

kxkpmulp2#

我最喜欢这个:

$('div.cost').children().remove().end().text();

我觉得更简洁(不知道效率)。
source
runkit

vnjpjtjt

vnjpjtjt3#

我用这个帖子
Get the text after span element using jquery
作为制作小提琴参考
http://jsfiddle.net/TKwhY/
这对我来说是新的,但是您可以通过只返回nodeType 3的元素来获取文本节点

var a = $('.cost').first().contents().filter(function() {
    return this.nodeType == 3;
});
p1iqtdky

p1iqtdky4#

如果确定它是最后一个文本子对象,则可以用途:

$(".cost").contents().last().text().trim();

但这里有一个比selected answer更通用的方法(我避免使用.first()并修剪文本):

import cheerio from "cheerio";

const html = `
<div class="outer tile">
  <div class="cost">
    <span class="text">Purchase price </span>
    <small>$</small>5.25
  </div>
</div>
`;
const $ = cheerio.load(html);

const result = [...$(".cost").contents()]
  .filter(e => e.type === "text" && $(e).text().trim())
  .map(e => $(e).text().trim())
  .join(""); // optional
console.log(result);

另请参阅:

  • 如何在Cheerio中获得由不同HTML标记分隔的文本
  • cheerio:获取普通+文本节点
  • 如何在Cheerio中获取单个<br>标记后的文本

相关问题