gpt4 book ai didi

ruby - 获取特定索引 nokogiri 中的元素

转载 作者:数据小太阳 更新时间:2023-10-29 07:49:52 26 4
gpt4 key购买 nike

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

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

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

我一直在尝试以下方法:

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

最佳答案

我认为您没有理解我们如何使用像 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 它返回与选择器匹配的第一个节点。 //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 以来,在大文档上它会变慢并且不必要地占用内存吗?查找文档中与选择器匹配的所有节点,然后在仅选择一个节点后将其丢弃。 search , cssxpath所有行为都是这样,所以,如果您只需要第一个匹配的节点,请使用 at或其 at_cssat_xpath等价物并提供足够明确的选择器以找到您想要的标签。

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

<html>
<head></head>
<body></body
</html>

(您告诉 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>

和:

require 'nokogiri'

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

puts doc.to_html
# >> <p>foo</p>

关于ruby - 获取特定索引 nokogiri 中的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25696908/

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