5

我正在尝试获取<p>标签的父类名称?

<div class="entry-content">
   <p>Some text...</p>
</div>

我怎样才能得到这个?

4

4 回答 4

6

有些人发现使用 css 和 nokogiriparent方法比 xpath 更容易阅读/维护:

html = %q{
<div class="entry-content">
   <p>Some text...</p>
</div>
}

doc = Nokogiri::HTML(html)
doc.css('p').each do |p|
    puts p.parent.attr('class')
end
于 2013-08-19T17:38:27.160 回答
5

使用类似//p/..or的 XPath //*[p](任何深度的任何“p”元素的父级)。

str =<<__HERE__
<div class="entry-content">
   <p>Some text...</p>
</div>
__HERE__

html = Nokogiri::HTML(str)
p_parents = html.xpath('//p/..') # => NodeSet containing the "<div>" element.
p_parents.each do |node|
  puts node.attr('class') # => "entry-content"
end
于 2013-08-19T16:33:53.820 回答
2

我会使用#at_css, 而不是css.

require 'nokogiri'

str =<<__HERE__
<div class="entry-content">
   <p>Some text...</p>
</div>
__HERE__

html = Nokogiri::HTML(str)
p_parent = html.at_css('p').parent
p_parent.name # => "div"
p_parent['class'] # => "entry-content"
于 2013-08-19T18:15:02.227 回答
1

这是 XPath 的一个很好的用例。以下是我的做法:

require 'nokogiri'

doc = Nokogiri::HTML(<<EOT)
<div class="entry-content">
   <p>Some text...</p>
</div>
EOT

puts doc.at('//p/..')['class']

哪个输出:entry-content.

如果您可能有多个<p>标签并且需要访问其父类的类,请使用:

puts doc.search('//p/..').map{ |n| n['class'] }

再次输出:entry-content.

在任何一种情况下,使用[]符号都是检索与标签参数关联的值的捷径。

而且,正如我们..在列出目录时在 *nix 命令行中看到的那样,..表示父元素。

Nokogiri 支持使用 CSS 选择器在文档中导航,但 CSS 很长一段时间不支持“父”访问器。CSS 4 确实有办法到达那里,但 Nokogiri v1.6.0 似乎还不支持它。例如,我们应该能够使用类似的选择器,$* > p但它不起作用:

doc.at('$* > p')
Nokogiri::CSS::SyntaxError: unexpected '$' after ''

doc.at('* > p')
=> #<Nokogiri::XML::Element:0x3ff7c099f528 name="p" children=[#<Nokogiri::XML::Text:0x3ff7c099f2e4 "Some text...">]>

是 CSS 中的$一个标记,表示选择器的特定部分是我们感兴趣的部分。有关更多信息,请参阅“确定选择器的主题”。一旦 Nokogiri 支持“主题”,我们就可以简化我们的 CSS 选择器及其随附的 Ruby 代码,因为我们不需要使用parent方法来设置父节点。在那之前,我们仍然有使用parent.

于 2013-08-20T14:47:54.670 回答