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

时间:2016-10-29 09:46:35

标签: javascript jquery cheerio

我是Javascript的新手,并希望使用Cheerio库来进行一些网页抓取。在图书馆的介绍中遇到了这个文本。我不确定选择器,上下文和根之间有什么区别。

从文档中摘录:

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

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

selector在上下文范围内搜索在根范围内搜索。选择器和上下文可以是字符串表达式,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() // =&GT;苹果

$('ul .pear')。attr('class') // =&GT;梨

$( '的Li [类=橙]')。HTML() // =&GT;橙

在第一个例子中,.apple是选择器,而#fruits是上下文。那讲得通。在第二个例子中,是ul选择器和.pear上下文?如果选择器用于在上下文中搜索,那么.pear嵌套在ul中会很奇怪吗?

1 个答案:

答案 0 :(得分:2)

jQuery,在扩展Cheerio中,使用了一种叫做“上下文”的东西,它确实有一个特殊的含义。

上下文是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元素,即没有其他类