Jquery 如何在Nokogiri中使用:eq选择器
在jQuery中,您可以使用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
: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("...")