我想用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>
标记之前解决该元素,因为该国家/地区始终是最后一个元素。
我该怎么做?
答案 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