2012-01-12 77 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屬性的節點」。

相關問題