我正在尝试获取<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
的旧工作。