gpt4 book ai didi

jquery - 如何使用:eq selector in Nokogiri

转载 作者:数据小太阳 更新时间:2023-10-29 08:05:05 25 4
gpt4 key购买 nike

在 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)')
# -> []

最佳答案

我是这样钓鱼的:

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">]>]

Nokogiri 返回了一个 NodeSet,它是一组节点,就像一个数组。我可以使用 at 进行搜索而不是 search仅检索节点:

doc.at('//p[3]').text
=> "foobar"

或者它可以返回 NodeSet,您可以让 Ruby 从中提取特定元素:

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

p doc.search('p:eq(0)')

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


Your example doesnt even do what I want. The [i] operator is comparable to the nth-child!

根据 jQuery's documentation for :eq :

Description: Reduce the set of matched elements to the one at the specified index.

//p[3] ,或使用 search('p')[2]让 Ruby 对 NodeSet 进行切片,将返回一个特定的节点。在我的示例中,我正在检索第三个 <p> 的内容标签,相当于 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

我看到将其转储到 IRB 中:

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

使用 //p[1]相当于将下面的 HTML 与 JavaScript 和 jQuery 一起使用,将其加载到浏览器中,然后查看显示“foo”的警报:

<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>

所以,//p[1]在 XPath 中切片或 [0]在 Ruby 中,相当于 :eq(0)在 JavaScript 中。但是,由于 Nokogiri 不执行 JavaScript 或 jQuery,您必须使用 CSS 或 XPath。


jQuery 的选择器现在可用,使这样的事情成为可能:

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"

关于jquery - 如何使用:eq selector in Nokogiri,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13289886/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com