Goodreads网站上jQuery选择器的行为不一致

问题描述

试图从goodreads site提取引号,并遇到不一致的行为。例如,转到以下页面https://www.goodreads.com/quotes?page=56 并在Chrome控制台中运行此选择器:jQuery(".quote"),您将获得一个引用Mark Twain的节点列表:

“每个人都是月亮,有黑暗的一面,他从没有向任何人露过。” ―马克·吐温

是第二个,您可以直观地看到它是第二个。

但是当您运行时: jQuery(".quotes .quote:nth-of-type(2)")不返回任何内容,只有运行jQuery(".quotes .quote:nth-of-type(3)")时,它才会返回Mark Twain的报价,该报价应该是第二个,而不是第三个。

为什么会这样?

解决方法

检查该页面上的元素,您将得到:

enter image description here

第二个元素不是.quote,而是:

<div data-react-class="ReactComponents.NativeAd" ... ></div>

因此.quotes .quote:nth-of-type(2)不会选择任何内容,因为.quote元素都不是.quotes父元素的第二个子元素;那就是广告所在的地方。

.quotes .quote:nth-of-type(3)选择第二个引号,因为广告位于第一和第二个引号之间,因此第二个引号实际上是其父级的第三个子代。

请记住,nth-of-type选择了第n个标签名。在这里,由于所有子级都是<div>,因此.quotes .quote:nth-of-type(3)选择第三个<div>,恰好是.quote。 (它不会选择类集合中的nth元素)