Jquery 如何在Nokogiri中使用:eq选择器

Jquery 如何在Nokogiri中使用:eq选择器,jquery,ruby,nokogiri,Jquery,Ruby,Nokogiri,在jQuery中,您可以使用:eq选择器将匹配元素集减少为具有给定索引的元素集 Nokogiri怎么能做到这一点?我找了很久,但找不到路 请参见此示例: require 'nokogiri' html =' <div> <p>foo</p></div> <span> <p>bar</p> <p>foobar</p></span> ' doc = Nokogiri::HTML

在jQuery中,您可以使用
:eq
选择器将匹配元素集减少为具有给定索引的元素集

Nokogiri怎么能做到这一点?我找了很久,但找不到路

请参见此示例:

require 'nokogiri'

html ='
<div>
<p>foo</p></div>
<span>
<p>bar</p>
<p>foobar</p></span>
'

doc = Nokogiri::HTML(html)

p doc.search('p:eq(0)')
# -> []
需要“nokogiri”
html='1〕
福

酒吧

福巴

' doc=Nokogiri::HTML(HTML) p文档搜索('p:eq(0)') # -> []
尝试使用(第一个元素是find with N=1)

我是这样钓鱼的:

require 'nokogiri'

html ='
<p>foo</p>
<p>bar</p>
<p>foobar</p>
'

doc = Nokogiri::HTML(html)

doc.search('//p[3]')
=> [#<Nokogiri::XML::Element:0x811058ac name="p" children=[#<Nokogiri::XML::Text:0x81104f74 "foobar">]>]
或者它可以返回节点集,您可以让Ruby从中提取特定元素:

doc.search('//p')[2].text
=> "foobar"

'p:eq(0)
不是CSS,也不是XPath。它是添加到JavaScript中的jQuery选择器。不能将jQuery或JavaScript与Nokogiri一起用作访问器,它必须是CSS或XPath


你的例子根本不能满足我的要求。[i]运算符可与第n个子运算符进行比较

Per:

描述:将匹配元素集减少为指定索引处的元素集

//p[3]
,或者使用
搜索('p')[2]
让Ruby对节点集进行切片,将返回一个特定的节点。在我的示例中,我正在检索第三个
标记的内容,它相当于jQuery的
:eq(2)

使用与前面相同的示例:

require 'nokogiri'

html ='
<p>foo</p>
<p>bar</p>
<p>foobar</p>
'

doc = Nokogiri::HTML(html)

doc.search('//p[0]').text
doc.search('//p[1]').text
doc.search('//p[2]').text
doc.search('//p[3]').text

doc.search('//p')[0].text
doc.search('//p')[1].text
doc.search('//p')[2].text
doc.search('//p')[3].text
使用
//p[1]
相当于将下面的HTML与JavaScript和jQuery一起使用,将其加载到浏览器中,并查看显示“foo”的警报:


似乎减少匹配节点集的唯一方法是使用Ruby和如下的数组方法:

doc = Nokogiri ... 
doc.search("table")[2].search("...")

Nokogiri的XPath和CSS选择器都不支持与jQuery的
:eq
运算符相等的函数性。

谢谢。css选择器是否有一个等价物?Nokogiri默认理解css和css选择器。试试看,不行。这就是我为什么要问的原因。查看我的帖子。什么不起作用?您是否尝试过CSS或jQuery。这是有区别的,
:eq
不是一个。参见我的编辑:jquery中的eq将返回匹配的第一个元素。我用一个例子更新了我的帖子,这个例子表明:eq在nokogiri中没有任何作用。
require 'nokogiri'

html ='
<p>foo</p>
<p>bar</p>
<p>foobar</p>
'

doc = Nokogiri::HTML(html)

doc.search('//p[0]').text
doc.search('//p[1]').text
doc.search('//p[2]').text
doc.search('//p[3]').text

doc.search('//p')[0].text
doc.search('//p')[1].text
doc.search('//p')[2].text
doc.search('//p')[3].text
irb(main):011:0* doc.search('//p[0]').text # => ""
irb(main):012:0> doc.search('//p[1]').text # => "foo"
irb(main):013:0> doc.search('//p[2]').text # => "bar"
irb(main):014:0> doc.search('//p[3]').text # => "foobar"

irb(main):015:0> doc.search('//p')[0].text # => "foo"
irb(main):016:0> doc.search('//p')[1].text # => "bar"
irb(main):017:0> doc.search('//p')[2].text # => "foobar"
irb(main):018:0> doc.search('//p')[3].text 
NoMethodError: undefined method `text' for nil:NilClass
from (irb):18
<html>
  <head>
      <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
  </head>
  <body>
    <p>foo</p>
    <p>bar</p>
    <p>foobar</p>
    <script>
$().ready(function(){
    alert($('p:eq(0)').text());
});
    </script>
  </body>
</html>
require 'nokogiri'

html = '
<html>
  <body>
    <p>foo</p>
    this text
    <p>bar</p>
  </body>
</html>
'

doc = Nokogiri::HTML(html)
doc.at('p:contains("foo")').next_sibling.text.strip
=> "this text"
doc = Nokogiri ... 
doc.search("table")[2].search("...")