2015-11-19 37 views
2

我有一个包含一个HTML文档数据:解析HTML(不遵循HTML语义)使用引入nokogiri

<div> 
    <p class="someclass"> 
     <ul> 
      <li>Item 1</li> 
      <li>Item 2</li> 
     </ul> 
    </p> 
</div> 

在解析使用:

div_node.children.each do |child| 
    if child.node_name == 'p' 
    #store it as html string in db 
    store(child.to_html) 
    end 
end 

当我检查数据库,我只得到外<p>标签:

<p class="someclass"> 
</p> 

没有内<ul>标签内容被存储或保留rieved。

我知道<p>标签不能包含<ul>标签,但我们从客户得到的文档中有数据,有大约1000个文档与数据,所以我不能编辑手动

+0

@Pete再次将p标签转换为div我将不得不使用nokogiri那里将不会有任何内容g节点,转换后的div标签也是如此。 想法? – ashishmohite

回答

1

我结束了使用Nokogiri::XML解析器解析HTML DOC

我曾在许多地方

解析代码

@xml_doc = Nokogiri::XML.parse(file) { |cfg| cfg.noblanks } 
@xml_doc.remove_namespaces! 

变化完成

改变我的脚本
  • 变化attribute方法attr
  • text方法在这里并不需要链接attr
  • 需要检查一下,虽然
  • 一些更多的分析逻辑变化需要
  • node.to_html的作品就像一个魅力在这里无效HTML5标签所以我能够存储完整的HTML分贝
1

尝试使用Nokogiri::XML解析器而不是Nokogiri::HTML之一。它不应该关心标签语义,但我不确定它将如何处理那些不是有效的XML的HTML5部分。

+0

准确地说,我将不得不改变整个脚本的数千行:(如果我尝试将其解析为xml – ashishmohite

+2

无效的HTML被固定并标记在'errors'中。无效的HTML5标记在XML中不重要,除非它们是语法错误,在这种情况下,它们也会被修正并被标记.XML并没有给像HTML这样的标签赋予特殊的含义,所以它应该只关心标签嵌套和正确关闭。 –