Nokogiri 相当于 jQuery Closest() 方法,用于在树中查找第一个匹配的祖先
jQuery 有一个可爱的方法,虽然命名有些错误,称为 closest() ,它会沿着 DOM 树查找匹配的方法元素。例如,如果我有以下 HTML:
<table src="foo">
<tr>
<td>Yay</td>
</tr>
</table>
假设 element
设置为 ,那么我可以算出
src
的值像这样:
element.closest('table')['src']
如果 table 元素或其 src 属性丢失,那么将干净地返回“undefined”。
在 Javascriptland 中习惯了这一点后,我很想在 Rubyland 中找到与 Nokogiri 等效的东西,但我能想到的最接近的是使用 ancestors():
ancestors = element.ancestors('table')
src = ancestors.any? ? first['src'] : nil
需要三元,因为如果调用空数组。更好的想法?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您可以在空数组上调用
first
,问题是它将返回nil
并且您不能说nil['src']
没有悲伤。你可以这样做:如果你在Rails中,你可以这样使用
try
:如果你经常做这种事情,那么将丑陋的地方隐藏在一个方法中:
然后
你也可以将其直接修补到 Nokogiri::XML::Node (但我不推荐它):
You can call
first
on an empty array, the problem is that it will returnnil
and you can't saynil['src']
without getting sad. You could do this:And if you're in Rails, you could use
try
thusly:If you're doing this sort of thing a lot then hide the ugliness in a method:
and then
You could also patch it right into Nokogiri::XML::Node (but I wouldn't recommend it):
您还可以使用 xpath 执行此操作:
You can also do this with xpath:
您想要最接近的表祖先的
src
属性(如果存在)?不是通过 XPath 获取可能存在的元素,然后通过 Ruby 获取属性,而是直接在 XPath 中请求属性:您将得到属性或 nil:
You want the
src
attribute of the closest table ancestor, if it exists? Instead of getting an element that might exist via XPath and then maybe getting the attribute via Ruby, ask for the attribute directly in XPath:You'll get either the attribute or nil: