使用Ruby解析HTML表,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,也就是说,我想只从第二个开始剥离文本。因此,通过这种方式,我只从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)')

相关内容

  • 没有找到相关文章