如何使用 <p> Nokogiri 获取标签父类名?



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

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

我怎样才能得到这个?

有些人发现使用css和nokogiri parent方法比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

使用类似//p/..//*[p]的XPath(任何深度的任何"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

我会使用#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"

这是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很长一段时间都不支持"父"访问器。CSS4确实有办法做到这一点,但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的旧工作。

相关内容

  • 没有找到相关文章

最新更新