Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Ruby解析HTML表,Nokogiri省略列标题_Ruby_Nokogiri - Fatal编程技术网

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

使用Ruby解析HTML表,Nokogiri省略列标题,ruby,nokogiri,Ruby,Nokogiri,我无法使用Nokogiri和Ruby解析HTML表。我的HTML表结构如下所示 <table> <tbody> <tr> <td>Firstname</td> <td>Lastname</td> <td>Middle</td> </tr> <tr> <td>ding</

我无法使用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>

名字
姓氏
中间的
叮
侗族
凌
....
....
.... {存在更多具有类似数据的tr和td。}
....
....
....
....
....       
在上面的HTML表中,我想完全删除第一个元素和相应的元素,因此删除Firstname、Lastname和Middle,也就是说,我只想开始从第二个元素中剥离文本。这样,我只从第二个或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
运行上述两个代码段中的任何一个后,
将包含第一个代码段之后的每个
。例如,
放置行。to_xml
打印以下内容:

<tr><td>ding</td>
       <td>dong</td>
       <td>ling</td>
    </tr>
要仅获取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确实支持,所以您可以使用

@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))

您确定这是否会给我第二个tr[2]中的文本吗。我不想把它转换成xml。我只想要从第二个tr[2]开始的HTML文本。嗨,John,谢谢你的解释。我对代码片段做了一些修改,并做到了这一点。它对我有用。rows.xpath('td').map(&:text)[0,3]。我还有一个请求需要帮助。我该怎么做呢。在表的第二列和第三列中,每个值的开头都有一个$符号。我如何剥离美元符号,同时仍然从所有3列中提取文本。所以我得到了[“叮”,“10000美元”,“0.4567美元]。添加$符号是因为它们是美元值。所以我只想去掉美元符号,仍然可以从td中得到文本。你能帮我一下吗?定义“剥离文本”。您到底想要什么作为输出?
@doc.at_css('table#table_id').css('tr:not(:has(th))')