获取表格单元格中的最后一个字

时间:2013-01-10 19:58:34

标签: ruby parsing nokogiri scraper

我想用Ruby和Nokogiri从表中抓取数据。

有很多<td>个元素,但我只需要一个仅在<br>元素之后的文本的国家/地区。问题是,<td>元素不同。有时不仅仅是这个国家。

例如:

<td><a href="#">Title1</a><br>USA</td>
<td><a href="#">Title2</a><br>Michael Powell<br>UK</td>
<td><a href="#">Title3</a><br>Leopold Lindtberg<br>Ralph Meeker<br>Switzerland</td>

我想在结束</td>标记之前解决该元素,因为该国家/地区始终是最后一个元素。

我该怎么做?

2 个答案:

答案 0 :(得分:2)

我用这个:

require 'awesome_print'
require 'nokogiri'

html = '
<td><a href="#">Title1</a><br>USA</td>
<td><a href="#">Title2</a><br>Michael Powell<br>UK</td>
<td><a href="#">Title3</a><br>Leopold Lindtberg<br>Ralph Meeker<br>Switzerland</td>
'

doc = Nokogiri::HTML(html)
ap doc.search('td').map{ |td| td.search('text()').last.text }

[
    [0] "USA",
    [1] "UK",
    [2] "Switzerland"
]

问题在于,您正在解析的HTML不会包含<td>个标记行,因此您必须找到要解析的标记。相反,它们会散布在<tr>标记之间,甚至可能散布在不同的<table>标记之间。由于您的HTML示例没有显示文档的真实结构,因此我无法为您提供更多帮助。

答案 1 :(得分:0)

有许多不同的解决方案。仅使用标准库的另一种解决方案是将您不想要的东西分类出来。

node_string = <<-STRING
  <td><a href="#">Title1</a><br>USA</td>
  <td><a href="#">Title2</a><br>Michael Powell<br>UK</td>
  <td><a href="#">Title3</a><br>Leopold Lindtberg<br>Ralph Meeker<br>Switzerland</td>
STRING
node_string.split("<td>").collect do |str| 
  last_str = str.split("<br>").last
  last_str.gsub(/[\n,\<\/td\>]/,'') unless last_str.nil?
end.compact