2013-01-10 52 views
2

我想用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>标记之前解决元素,因为该国是永远的最后一个元素。

我该怎么做?

+1

我没有看到任何代码显示您已尝试解决该问题。请张贴一些。 –

回答

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示例没有显示文档的真实结构,因此我无法为您提供更多帮助。

+2

or more XPath and less Ruby:'doc.search('// td/text()[last()]')。map(&:text)#=> [“USA”,“UK”,“Switzerland “]' – Phrogz

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 
相关问题