ruby nokogiri跨多页提取表/合并连续表



我需要从html中的一个部分提取第一个表(而不是第一个表标记中的材料)。该表可能分布在多个页面中,因此它可能位于多个表标签下。节中可能有多个表。我的逻辑是,如果表标记之间有文本节点,那么它们就是不同的表。如果表标记之间没有文本节点,则它们是一个表的一部分。我该如何实现?

我没有使用xpath来查找第一个表,因为我需要首先使用reg-exp来检查每个文本节点,从而确定适当的部分。

html='<body>
<table border="1">
<tr>
<td>row 1, cell 1</td>
<td>row 1, cell 2</td>
</tr>
<tr>
<td>row 2, cell 1</td>
<td>row 2, cell 2</td>
</tr>
</table>
<table border="1">
<tr>
<td>row 3, cell 1</td>   
<td>row 3, cell 2</td>
</tr>
<tr> 
<td>row 4, cell 1</td>
<td>row 4, cell 2</td>
</tr>
</table>
<p>text </p>                       # Split by text, the below is a different table
<table border="1">
<tr>
<td>row 5, cell 1</td>
<td>row 5, cell 2</td>
</tr>
<tr>
<td>row 6, cell 1</td>
<td>row 6, cell 2</td>
</tr>
</body>'

这是我当前的代码,它只获取第一个table标记,而不是第一个table(示例中的第1-4行)。我使用gem表解析器来提取表。

require 'nokogiri'
require 'table_parser'
doc = Nokogiri::HTML(html)
table = Array.new
i = 0
doc.traverse do |node|
    if node.name == 'table' && i == 0
        table = TableParser::Parser::extract_table(node, node.path)
        i +=1
    end
end
puts table

听起来你想合并连续的表:

# find each table that follows another table. Then reverse that so you're iterating from bottom to top.
doc.search('table + table').to_a.reverse.each do |table|
  # add each of the tables tr's to the previous table
  table.search('tr').each{|tr| table.previous.add_child tr}
  # then remove the table
  table.remove
end

相关内容

  • 没有找到相关文章

最新更新