Cheerio: 如何通过文本内容选择元素?

31

我有一些类似这样的HTML:

<span id="cod">Code:</span> <span>12345</span>
<span>Category:</span> <span>faucets</span>
我想获取分类名称(“faucets”)。这是我的尝试:
var $ = cheerio.load(html.contents);
var category = $('span[innerHTML="Category:"]').next().text();

但是这个方法不起作用(innerHTML 修改器选择不到任何内容)。

有什么线索吗?


你不能给你的物品分类吗? - user1106925
2
该项不是“我的” :-) 我正在解析一个我无法控制的外部页面... - MarcoS
2个回答

62

你的代码没有生效的原因是因为 [innerHTML] 是一个属性选择器,而 innerHTML 不是元素上的属性(这意味着没有被选中的东西)。

你可以根据文本内容过滤span元素。在下面的示例中,.trim() 被用来去除任何空格。如果文本等于“Category:”,则该元素包含在返回的过滤后的元素集中。

var category = $('span').filter(function() {
  return $(this).text().trim() === 'Category:';
}).next().text();
上面的代码片段将过滤出文本内容完全为“Category:”的元素。如果你想要选择那些包含该字符串的元素,你可以使用:contains 选择器(正如评论中指出的那样)。
var category = $('span:contains("Category:")').next().text();

或者,使用.indexOf()方法也可以:

var category = $('span').filter(function() {
  return $(this).text().indexOf('Category:') > -1;
}).next().text();

1
非常好用,谢谢。我不知道filter(),感觉有点傻... :-( - MarcoS
11
如果他想检查它是否包含某个字符串,他也可以使用 $('span:contains("Category:")') - Paul
1
@Paulpro Cheerio有 :contains 选择器吗?我查看了文档,但在其中没有看到它,因此我没有使用它。 - Josh Crozier
1
@JoshCrozier 我不了解Cheerio,但标签维基页面上说它是jQuery核心的一种实现,所以我会认为是这样的。 - Paul
4
看起来它使用了这个选择器库,并支持包含:https://www.npmjs.com/package/CSSselect。 - Paul

12
一个更简单的解决方案是:
var category = $('span:contains("Category:") + span').text()

这是css加上jQuery的:contains 伪元素,由 cheerio 提供支持。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接