Ruby Nokogiri解析复杂HTML表格:合并分散TD文本
用Ruby Nokogiri提取并合并连续td.detailData文本的方案
示例HTML
假设你的目标HTML结构如下:
<table class="detailRecordTable"> <tr> <td class="detailData">单个单元格的完整文本</td> <td class="label">无关标签</td> <td class="detailData">分散内容的第一部分</td> <td class="detailData">分散内容的第二部分</td> <td class="detailData">分散内容的第三部分</td> <td class="label">其他无关内容</td> <td class="detailData">最后一个独立文本</td> </tr> </table>
期望输出
把连续的.detailData单元格文本合并,最终得到数组:
["单个单元格的完整文本", "分散内容的第一部分 分散内容的第二部分 分散内容的第三部分", "最后一个独立文本"]
正确实现代码
require 'nokogiri' # 替换为你的实际HTML内容 html = <<~HTML <table class="detailRecordTable"> <tr> <td class="detailData">单个单元格的完整文本</td> <td class="label">无关标签</td> <td class="detailData">分散内容的第一部分</td> <td class="detailData">分散内容的第二部分</td> <td class="detailData">分散内容的第三部分</td> <td class="label">其他无关内容</td> <td class="detailData">最后一个独立文本</td> </tr> </table> HTML doc = Nokogiri::HTML(html) target_table = doc.at_css('table.detailRecordTable') merged_texts = [] current_batch = [] # 遍历表格内所有td元素 target_table.css('td').each do |td| if td.attribute('class')&.value&.include?('detailData') # 是目标td,将文本去空格后加入当前批次 current_batch << td.text.strip else # 遇到非目标td,若当前批次有内容则合并后存入结果 unless current_batch.empty? merged_texts << current_batch.join(' ') current_batch = [] end end end # 处理循环结束后剩余的最后一批目标td merged_texts << current_batch.join(' ') unless current_batch.empty? # 输出结果 p merged_texts
代码逻辑说明
- 先定位到目标表格
detailRecordTable - 遍历表格内所有
td,用current_batch临时存储连续的目标td文本 - 遇到非目标td时,将临时存储的文本合并后加入结果数组,清空临时批次
- 循环结束后检查临时批次是否有剩余内容,避免遗漏最后一组连续目标td
内容的提问来源于stack exchange,提问作者snoozy
相关产品推荐
相关产品推荐

