如何使用Ruby / Nokogiri来剥离和标签中未包含的标签?<table> </table>

时间:2014-06-08 17:13:16

标签: ruby nokogiri

我正在处理一些格式错误的HTML,其中表格元素未包含在表格标记中,例如:

<div class="row">
  <div class="large-12 columns main-content">
    <tr>
      <td colspan="4"><img src="../img/H006265.jpg"></td>
    </tr><tr valign="top">
    <td> </td>
    </tr>
  </div>
</div>

我想摆脱垃圾标签并最终得到类似的东西:

<div class="row">
  <div class="large-12 columns main-content">
    <img src="../img/H006265.jpg">
  </div>
</div>

文档中的其他地方有合法的表格,所以我不能完全剥离和标记,只能将那些没有包含在标记中的表格。

我试过让Nokogiri解析它,认为它会清理错误的HTML,但无济于事:

Nokogiri::HTML::DocumentFragment.parse(badly_formed_html_string)

2 个答案:

答案 0 :(得分:1)

您可以使用已解析的片段来清理HTML:

frag = Nokogiri::HTML::DocumentFragment.parse(badly_formed_html_string)
frag.css('tr').each do |tr|
  tr.add_previous_sibling tr.children
  tr.remove
end
frag.css('td').each do |td|
  td.add_previous_sibling td.children
  td.remove
end
puts frag.to_s
# <div class="row">
#   <div class="large-12 columns main-content">
#     <img src="../img/H006265.jpg">
#      
#     </div>
# </div>

答案 1 :(得分:1)

感谢Uri的代码帮助我找到了一个好的答案,但是他很接近,但是这样做只会在没有封装在标签中时剥离这些标签:

def strip_tag_if_not_in_parent(doc, tag, parent)
  doc.css(tag).each do |element|
    if (element.parent.name != parent)
      new_element = Nokogiri::HTML::DocumentFragment.parse(element.inner_html)
      element.replace new_element
    end
  end

  doc
end

doc = strip_tag_if_not_in_parent(doc, 'tr', 'table')
doc = strip_tag_if_not_in_parent(doc, 'td', 'tr')