使用Ruby解析HTML表,Nokogiri省略列标题

时间:2012-03-24 06:34:32

标签: ruby nokogiri

使用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]得到表的内容,没有列标题。

有人可以提供一些代码来说明如何执行此操作。

感谢。

3 个答案:

答案 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)')