我在使用Nokogiri和Ruby解析HTML表时遇到问题。我的HTML表结构看起来像这个
<table>
<tbody>
<tr>
<td>Firstname</td>
<td>Lastname</td>
<td>Middle</td>
</tr>
<tr>
<td>ding</td>
<td>dong</td>
<td>ling</td>
</tr>
....
....
.... {more tr's and td's with similar data exists.}
....
....
....
....
....
</tbody>
</table>
在上面的HTML表中,我想完全删除第一个和相应的元素,所以删除Firstname、Lastname和Middle,也就是说,我想只从第二个开始剥离文本。因此,通过这种方式,我只从second或tr[2]中获取表的内容,而不获取列标题。
有人能给我一个如何做到这一点的代码吗。
谢谢。
require 'rubygems'
require 'nokogiri'
doc = Nokogiri::HTML(x)
rows = doc.xpath('//table/tbody/tr[position() > 1]')
# OR
rows = doc.xpath("//table/tbody/tr")
header = rows.shift
在运行了以上两个代码段中的任何一个之后,rows
将包含第一个代码段之后的每个<tr>...</tr>
。例如,puts rows.to_xml
打印以下内容:
<tr><td>ding</td>
<td>dong</td>
<td>ling</td>
</tr>
要获取内部文本,删除所有html标记,请运行puts rows.text
ding
dong
ling
要仅获取td标记的内部文本,请运行rows.xpath('td').map {|td| td.text }
["ding", "dong", "ling"]
或者:
table.css('tr')[1..-1]
或者从第2行开始剥离文本:
table.css('tr')[1..-1].map{|tr| tr.css('td').map &:text}
由于Nokogiri确实支持:具有CSS伪类,因此可以使用获取标题行
@doc.at_css('table#table_id').css('tr:has(th)')
由于它确实支持:而不是CSS伪类,因此可以使用获取其他行
@doc.at_css('table#table_id').css('tr:not(:has(th))')
分别。根据您的偏好,您可能希望避免否定,只使用css('tr:has(td)')
。