使用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,即我想开始仅从第二个文本中删除文本。所以这样我只从第二个或tr [2]得到表的内容,没有列标题。
有人可以提供一些代码来说明如何执行此操作。
感谢。
答案 0 :(得分:1)
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"]
答案 1 :(得分:0)
可替换地:
table.css('tr')[1..-1]
或从第2行开始删除文本:
table.css('tr')[1..-1].map{|tr| tr.css('td').map &:text}
答案 2 :(得分:0)
由于Nokogiri支持:has CSS pseudo-class,您可以使用
进行标题行@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)')
。