我正在尝试获取<p>
标签的父类名称?
<div class="entry-content">
<p>Some text...</p>
</div>
我怎样才能得到这个?
有些人发现使用 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
使用类似//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
我会使用#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 很长一段时间不支持“父”访问器。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
.