0

HTMLのセクションから最初のテーブル(最初のテーブルタグのマテリアルではない)を抽出する必要があります。テーブルは複数のページに分散している可能性があるため、複数のテーブルタグの下にある可能性があります。セクションに複数のテーブルが存在する場合があります。私の論理は、テーブルタグの間にテキストノードがある場合、それらは異なるテーブルであるということです。テーブルタグの間にテキストノードがない場合、それらは1つのテーブルの一部です。どうすればこれを実装できますか?

最初にregexpを使用して各テキストノードをチェックすることで適切なセクションを特定する必要があるため、xpathを使用して最初のテーブルを検索しませんでした。

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ではなく最初のテーブルタグのみを取得します(サンプルの行1〜4)。テーブルの抽出にはgemtablerパーサーを使用しました。

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
4

1 に答える 1

0

連続したテーブルをマージしたいようです:

# 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
于 2013-02-07T06:01:33.850 に答える