2012-01-12 56 views
1
d=<<"EOM" 
<ul> 
    <li><a id=t href="t">a</a></li> 
    <li><a id=b href="b">b</a></li> 
    <li> 
    <ul> 
     <li><a href="inner">don't want inner</a></li> 
     <li><a href="inner">don't want inner</a></li> 
    </ul> 
    </li> 
    <li><a id=c href="c">c</a></li> 
</ul> 
<ul> 
    <li><a href="d">don't want</a></li> 
</ul> 
EOM 

doc = Nokogiri.HTML(d) 
t = doc.css("#t")[0] 

我怎样才能具有相同 外容器为“T”,并在同一 深度为“所有的HREFs T“?在这种情况下,我只想要 hrefs t,b,c。 这些不会总是在UL的,只是用 它作为一个例子。如何找到在同一深度与引入nokogiri一个共同的最近的祖先所有的链接

回答

1

要获得全部标签具有相同的 '祖父' 为T,你可以这样做:

doc.css('a').select{|a| a.parent.parent == t.parent.parent} 

得到他们的HREF:

doc.css('a').select{|a| a.parent.parent == t.parent.parent}.map{|a| a[:href]} 
0

感谢@pguardiario

父节点可以在任何级别的,所以我修改您的代码如下所示:

t = doc.css("#a")[0] 
r = [] 
p = t.parent 
x = 0 
while true 
    break if p.node_name == "body" || p.node_name == "html" 
    x += 1 
    r = doc.css('a').select{|a| 
    m = a 
    x.times { m = m.parent } 
    m == p 
    } 
    break if r.length > 1 
    p = p.parent 
end 
pp r.length 

我敢肯定有比这蛮力方法更好的方法。

1

如果你知道的ID将是一致的:

puts doc.search('#t, #b, #c').map{ |n| n['href'] } 

如果你不知道自己是什么,然后,XPath可让你有:

doc.search('//*[@id="t"]/../../*/*[@id]').to_html 
=> "<a id=\"t\" href=\"t\">a</a><a id=\"b\" href=\"b\">b</a><a id=\"c\" href=\"c\">c</a>" 

doc.search('//*[@id="t"]/../../*/*[@id]').map{ |n| n['href'] } 
=> ["t", "b", "c"] 

这意味着“找到节点用“T”的ID,然后备份两个层次往下看发现与填充的ID属性的节点”。

相关问题