访问没有id或类钩子的最后一个嵌套元素的文本值

时间:2014-01-07 21:10:47

标签: ruby nokogiri

我需要访问表格最后一行中第10个<td>元素的值。我不能使用ID作为钩子,因为只有表具有ID。我已经设法使用下面的代码使其工作。不幸的是,它的静态。我知道我将永远需要第10个<td>元素,但我永远不知道它需要哪一行。我只知道它需要是表格中的最后一行。如何动态地将"tr[6]"替换为实际的最后<tr>? (这可能很容易,但这实际上是我第一次用红宝石做任何事情。)

page = Nokogiri::HTML(open(url))
            test = page.css("tr[6]").map { |row| 
                    row.css("td[10]").text}

            puts test

3 个答案:

答案 0 :(得分:2)

你想这样做:

page.at("tr:last td:eq(10)")

答案 1 :(得分:0)

如果您不需要对页面执行任何其他操作,则可以使用

实际创建一行
test = Nokogiri::HTML(open(url)).search("tr").last.search("td")[10].text

否则(这会起作用):

page = Nokogiri::HTML(open(url))
test = page.search("tr").last.search("td")[10].text
puts test

示例:(使用StackOverflow上另一个问题的大表)

Nokogiri::HTML(open("http://en.wikipedia.org/wiki/Richard_Dreyfuss")).search('table')[1].search('tr').last.search('td').children.map{|c| c.text}.join(" ")
#=> "2013 Paranoia Francis Cassidy"

您是否有特殊原因需要Array包含1个元素?我的示例将返回一个字符串,但您可以轻松修改它以返回Array

答案 2 :(得分:0)

您可以使用CSS pseudo class selectors

page.css("table#the-table-id tr:last-of-type td:nth-of-type(10)")

首先选择具有相应<table>的{​​{1}},然后选择该表的最后一个id子项,然后选择{{1}的第10个<tr> }}。结果是所有匹配元素的数组,如果您希望只有一个,则可以使用<td>代替。

如果您更喜欢XPath,可以使用:

<tr>
相关问题