我是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中会很奇怪吗?
答案 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元素,即没有其他类