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