2017-03-17 58 views
-1

我正在使用Rails 5与Nokogiri。如何选择包含文本的最小元素?如何选择包含文本的最小元素

我有我的网页上这个元素:

<td class="style35" style="font-size: medium; border: thin solid #000000"> 
         Location</td> 

,我想我可以用选择它:

doc.at('td:contains("Location")') 

相反,选择了包含包含此元素表的包装TD :

<td><span class="myClass"><table> .... 

什么是写一个表达式的正确方法来选择更小包含我想要的文本的st(最简单?)元素?

+2

这不是“引入nokogiri”,这是“引入nokogiri”,“入围”的“选择”,“德”是“的”,“ocntains”是“包含”。语法和拼写对于SO非常重要。你的问题是参考页面的开始,答案就是问题的解决方案,就像是百科全书或食谱中的一个页面。 –

+1

请阅读“[mcve]”。您需要为我们提供一个HTML代码的最小示例,它将以单件形式展示问题,而不是以单独的块形式显示。不要让我们重建它。 –

回答

-1

选取所有td元素,按内容长度排序并选取第一个元素。根据您的需要更改选择器。排序默认为升序。所以你首先得到最小的元素。

doc.css('td').sort_by do |td_element| 
    l.text.length 
end.first 
+0

你的逻辑不适用于我的情况,tho。表达式“doc.at('td:contains(”Location“)'”只返回一个元素,运行“doc.at('td:contains(”Location“)')。在''td:contains(“Location”)')“为我提供了我想要的这个特定案例的元素,但是总的来说,我不知道有多少级别可以深入查找我要找的内容 – Dave

+0

This不是很好的逻辑,后续的单元格可能包含比期望的更短的字符串,而且你的示例代码是无效的,我建议你测试你的代码,对照示例HTML并显示你的结果。 –

0

如果使用at方法,它将只返回第一个结果。

css方法将返回所有匹配CSS选择器的元素,正确的td元素和td元素包装在整个表中。

如果使用这样的事情,它会发现所有的td标签,包含单词Location,那么它将存储未在阵列周围另一个td标签包装的元素:

td_with_no_child_and_have_location = [] 

doc.css("td:contains('Location')").each do |td_element| 
    if td_element.css("td").empty? 
     td_with_no_child_and_have_location << td_element 
    end 
end 

first_td = td_with_no_child_and_have_location.first 
+0

我没有很好地解释自己。我不希望TD拥有最少的HTML,我希望TD没有其他的孩子TD,其文本中包含单词“Location”。 – Dave

+0

我更新了答案,以便存储适合元素的数组如果你知道你的元素总是第一个元素,那么你可以使用该数组的第一个元素。 –

+0

感谢你的更新。有没有什么办法可以编写一个CSS选择器循环? – Dave

0

这是如果您不向我们提供最低的HTML,很难帮助您。我试图重建它,但情况因人而异:

require 'nokogiri' 

doc = Nokogiri::HTML(<<EOT) 
<html><body><table><tr> 
<td><span class="myClass"><table><tr> 
     <td class="style35" style="font-size: medium; border: thin solid #000000"> 
     Location</td> 
</tr></table></td></tr></table></html> 
EOT 
doc.at('.myClass td.style35').text # => "\n  Location" 

如果你想在标签嵌入到另一个表,然后采取的一些其他特性来帮助您导航,如类信息。

在这种情况下使用at应该有所帮助,因为通常情况下,表的标题将位于包含第一个单元格的第一行。 at相当于search('some selector').first

上面的选择器甚至可以写成.myCLass .style35td td,它会在另一个td内找到td。再加上at,你会得到第一个事故发生:

doc.at('.myClass td.style35').text # => "\n  Location" 
doc.at('.myClass .style35').text # => "\n  Location" 
doc.at('td td').text # => "\n  Location" 
+0

我在寻找somethign更一般。运输署并不总是将“myClass”作为一个班级。我正在寻找包含给定文本的TD,其中没有其他TD。 – Dave

+0

您需要在您的问题中提供更多信息。它非常宽泛,不符合“[mcve]”中的指导原则。我们不能投票,因为你有奖金。如果你想写一个通用的“总是找到一个标题”的单元格,而事先不知道该标题或文档的结构是什么,那么你将会很难。 –

相关问题