获取特定索引nokogiri的元素

The*_*ird 3 ruby nokogiri

如何获取索引2中的元素。

例如在以下html中,我要显示第三个元素,即DIV:

<HTMl>
    <DIV></DIV>
    <OL></OL>
    <DIV> </DIV>
</HTML>
Run Code Online (Sandbox Code Playgroud)

我一直在尝试以下方法:

p1 =  html_doc.css('body:nth-child(2)')
puts p1
Run Code Online (Sandbox Code Playgroud)

我是nokogiri的新手。请帮忙。

the*_*Man 5

我认为您不了解我们如何使用像Nokogiri这样的解析器,因为它比您想象的要容易得多。

我会用:

require 'nokogiri'

doc = Nokogiri::HTML(<<EOT)
<HTMl>
    <DIV>1</DIV>
    <OL></OL>
    <DIV>2</DIV>
</HTML>
EOT

doc.at('//div[2]').to_html # => "<div>2</div>"
Run Code Online (Sandbox Code Playgroud)

使用at它返回与选择器匹配的第一个Node。//div[2]是一个XPath选择器,它将返回<div>找到的第二个选择器。search可以用来代替at,但它返回一个NodeSet,就像一个数组,这意味着我需要提取该特定节点。

或者,我可以使用CSS代替XPath:

doc.search('div:nth-child(3)').to_html # => "<div>2</div>"
Run Code Online (Sandbox Code Playgroud)

对我而言,就可读性而言,这实际上不是对XPath的改进。

使用search查找所有出现的特定标签,意味着我必须从返回的NodeSet中选择特定元素:

doc.search('div')[1].to_html # => "<div>2</div>"
Run Code Online (Sandbox Code Playgroud)

要么:

doc.search('div').last.to_html # => "<div>2</div>"
Run Code Online (Sandbox Code Playgroud)

使用search这种方式的缺点是,由于会search找到与文档中的选择器匹配的所有节点,然后在仅选择一个节点之后将其丢弃,因此在大型文档上它会变慢并且不必要地占用大量内存。searchcssxpath所有的行为是那样的,所以,如果你只需要第一个匹配的节点,使用at或它at_cssat_xpath等价物,并提供足够明确的选择找到你想要的标签。

'body:nth-child(2)'根据我对它的了解,它不起作用是因为您没有正确使用它。nth-child查看提供的标签,并在其父下找到该标签的“第n个”出现。因此,您要在正文的“ html”父元素下要求第三个标签,该标签不存在,因为正确形成的HTML文档是:

<html>
  <head></head>
  <body></body
</html>
Run Code Online (Sandbox Code Playgroud)

(如何告诉Nokogiri解析文档,决定了结果DOM的结构。)

相反,使用:div:nth-child(3)表示“找到的父级的第三个孩子div,即“ body”,并生成第二个div标签。

返回如何告知Nokogiri解析文档;思考这些之间的区别:

doc = Nokogiri::HTML(<<EOT)
<p>foo</p>
EOT

puts doc.to_html
# >> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
# >> <html><body>
# >> <p>foo</p>
# >> </body></html>
Run Code Online (Sandbox Code Playgroud)

和:

require 'nokogiri'

doc = Nokogiri::HTML::DocumentFragment.parse(<<EOT)
<p>foo</p>
EOT

puts doc.to_html
# >> <p>foo</p>
Run Code Online (Sandbox Code Playgroud)


小智 4

如果您可以修改 HTML 添加 id 和类以轻松定位您要查找的内容(还可以添加 body 标记)。

如果您无法修改 HTML,请保持选择器简单并访问数组的第二个元素。

html_doc.css('div')[1]
Run Code Online (Sandbox Code Playgroud)