【问题标题】:How to use Ruby/Nokogiri to Strip <tr> and <td> tags not enclosed in <table> tag?如何使用 Ruby/Nokogiri 去除未包含在 <table> 标记中的 <tr> 和 <td> 标记?
【发布时间】:2014-06-08 17:13:16
【问题描述】:

我正在处理一些格式错误的 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)

【问题讨论】:

  • 您是否尝试过使用 XML 代替?至少要先清洁它

标签: ruby nokogiri


【解决方案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>

【讨论】:

  • 关闭,但我不想删除所有 和 标签,只有那些没有被 标签包围的标签。但非常有帮助,我投了赞成票。
【解决方案2】:

感谢 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')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-27
    • 2021-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-09
    • 1970-01-01
    相关资源
    最近更新 更多