获取元素索引nokogiri

时间:2014-09-06 04:51:37

标签: ruby nokogiri

如何在索引2处获取元素。

例如在下面的html中我想显示第三个元素,即DIV:

<HTMl>
    <DIV></DIV>
    <OL></OL>
    <DIV> </DIV>
</HTML>

我一直在尝试以下方法:

p1 =  html_doc.css('body:nth-child(2)')
puts p1

我是nokogiri的新手。请帮忙。

2 个答案:

答案 0 :(得分:4)

我不认为你理解我们如何使用像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>"

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

或者,我可以使用CSS而不是XPath:

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

对于我来说,就可读性而言,这并不是对XPath的改进。

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

doc.search('div')[1].to_html # => "<div>2</div>"

或者:

doc.search('div').last.to_html # => "<div>2</div>"

以这种方式使用search的缺点是,由于search找到与文档中的选择器匹配的所有节点,以及哪些是然后在选择一个之后扔掉。 searchcssxpath的行为都是这样的,因此,如果您只需要第一个匹配的节点,请使用at或其at_css和{{1等价物并提供足够明确的选择器来找到你想要的标签。

根据{{​​3}},

at_xpath不起作用,因为你没有正确使用它。 'body:nth-child(2)'查看提供的标记,并在 parent 下找到它的“第n”个匹配项。所以,你要求在body的“html”父级下面的第三个标记,这个标记不存在,因为正确形成的HTML文档将是:

nth-child

(如何告诉Nokogiri解析文档确定如何构建结果DOM。)

相反,请使用:<html> <head></head> <body></body </html> 说“找到div:nth-child(3)的父亲的第三个孩子,即”正文“,然后生成第二个div标签。

回到如何告诉Nokogiri解析文件;冥想这些之间的区别:

div

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>

答案 1 :(得分:1)

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

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

html_doc.css('div')[1]