问题描述
试图从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的报价,该报价应该是第二个,而不是第三个。
为什么会这样?
解决方法
检查该页面上的元素,您将得到:
第二个元素不是.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
元素)