jQuery/cheerio 选择器、上下文和根 - 有什么区别?

jQuery/cheerio selector, context and root - what's the difference?

我是 Javascript 的新手,想使用库 Cheerio 进行一些网络抓取。在图书馆的介绍中看到这篇文章。我不确定选择器、上下文和根之间有什么区别。

文档摘录:

Cheerio 的选择器实现与 jQuery 的几乎相同,因此 API 非常相似。

$( 选择器, [上下文], [根] )

选择器在根范围内搜索的上下文范围内搜索。选择器和上下文可以是字符串表达式、DOM 元素、DOM 元素数组或 cheerio 对象。 root 通常是 HTML 文档字符串。

此选择器方法是遍历和操作文档的起点。与 jQuery 一样,它是在文档中选择元素的主要方法,但与 jQuery 不同的是,它构建在 CSSSelect 库之上,该库实现了大多数 Sizzle 选择器。

示例API:

<ul id="fruits">
  <li class="apple">Apple</li>
  <li class="orange">Orange</li>
  <li class="pear">Pear</li>
</ul>

$('.apple', '#fruits').text() //=> 苹果

$('ul .pear').attr('class') //=> 梨

$('li[class=orange]').html() //=> 橙色


在第一个示例中,.apple 是选择器,#fruits 是上下文。那讲得通。在第二个例子中,ul 是选择器而 .pear 是上下文吗?如果选择器是要在 上下文中搜索,这很奇怪,因为 .pear 嵌套在 ul?

jQuery,在 Cheerio 的扩展中,使用了一种叫做 "context" 的东西,它确实有特殊的含义。

上下文是 jQuery 将搜索给定选择器的位置,因此在普通 JS 中,等效项是

document.getElementById('#fruit');

其中 document 是上下文,#fruit 是选择器。

Cheerio 中的默认上下文始终是 document,除非以格式

专门给出了另一个上下文
$(selector, context)

选择器只有两个字符串才有上下文,用逗号分隔,所以像这样的东西仍然会使用 document 作为上下文

$('#fruit, .apple')

它会搜索两个元素,而不是一个在另一个元素中等等。因为它只是一个字符串,包含一个逗号,所以它不是一回事。

您的第一个示例是唯一具有特殊上下文的示例,另外两个具有 document 作为上下文,并且是常规的 CSS 选择器。

$('.apple', '#fruits')

^ 这有上下文,并且与 $('#fruits').find('.apple')

完全相同
$('ul .pear')

^ 这没有特殊的上下文,它只是选择 UL

中的所有 .pear 元素
$('li[class=orange]')

^ 这也没有特殊的上下文,它选择所有具有 class 属性且完全匹配 orange 的 LI 元素,即没有其他 类