使用Ruby解析HTML表,Nokogiri省略列标题
我无法使用Nokogiri和Ruby解析HTML表。我的HTML表结构如下所示使用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</
<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))')