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>标签之前的元素,因为国家总是最后一个元素。

我怎样才能做到这一点?

4

2 回答 2

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

于 2013-01-10T20:59:41.317 回答
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
于 2013-01-10T21:05:57.680 回答