获取特定索引的元素nokogiri

问题描述 投票:3回答:2

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

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

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

我一直在尝试以下方法:

p1 =  html_doc.css('body:nth-child(2)')
puts p1
ruby nokogiri
2个回答
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>"

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

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

at

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

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

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

或:

search

以这种方式使用search的不利之处在于,由于NodeSet会找到所有与文档中的选择器匹配的节点,然后在选择后将其丢弃,因此在大文档上它会变慢并且不必要地占用大量内存只有一个。 doc.search('div')[1].to_html # => "<div>2</div>" doc.search('div').last.to_html # => "<div>2</div>" search的行为都一样,因此,如果只需要第一个匹配节点,请使用search或其等价的searchcss,并提供足够确定的选择器以查找您想要的标签。

xpath不起作用,因为根据“ at”以及我对它的理解,您没有正确使用它。 at_css查看提供的标签,并在其parent下找到该标签的“第n个”出现。因此,您要在正文的“ html”父元素下要求第三个标签,该标签不存在,因为正确形成的HTML文档为:

at_xpath

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

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

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

:nth-child()

和:

nth-child

1
投票

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

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

<html>
  <head></head>
  <body></body
</html>
© www.soinside.com 2019 - 2024. All rights reserved.