从Nokogiri的文档中提取所有父母

时间:2011-08-03 10:09:36

标签: html ruby xml nokogiri

我有一个这样的文件:

<DL><a lot of tags>...<H3>Entry 1</H3><a lot of tags>...</DL>
<DL><a lot of tags>...<H3>Entry 2</H3><a lot of tags>...
    <DL><a lot of tags>...<H3>Entry 21</H3><a lot of tags>...
        <DL><a lot of tags>...<H3>Entry 211</H3><a lot of tags>...</DL>
    </DL>
</DL>
<DL><a lot of tags>...><H3>Entry 3</H3><a lot of tags>...</DL>

我想找到所有''条目,并且使用以下代码很容易:

@doc=Nokogiri::HTML(@file)
@doc.css('DL>h3').each do |node| puts node.text end

如何为任何条目提取H3父母列表? 我希望有一个方法作为“父”返回关系,即: entry211.parent ==&gt; /条目2 /条目21 /

1 个答案:

答案 0 :(得分:1)

如果您只想要每个h3元素的父元素

@doc.css('DL>h3').collect(&:parent)

应该这样做。

但是,您可能希望所有h3元素都是dl元素的子元素,这些元素是h3元素的祖先。如果我已经正确地理解了你的结构,你应该能够做到

@doc.css('dl>h3').collect { |h3| h3.ancestors('dl').css('h3') }

这会为您提供一个Array,其中包含Arrayh3个元素,这些元素是每个dl元素祖先中h3个元素的后代。困惑?我肯定是:)。

例如,使用示例HTML,条目211 h3的结果为

@doc.css('dl>h3').collect { |h3| h3.ancestors('dl').css('h3') }[3].collect(&:text)
#=> ["Entry 211", "Entry 21", "Entry 2"]

这足够接近你想要的吗?