使用 Nokogiri 解析 HTML(不遵循 HTML 语义)

Parse HTML (without HTML semantics being followed) using Nokogiri

我有一个 HTML 文档包含数据:

<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> 标记内容。

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

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

部分

我最终使用 Nokogiri::XML 解析器来解析 HTML 文档

我不得不在许多地方更改脚本

解析代码

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

更改完成

  • attribute 方法更改为 attr
  • 此处不需要使用 text 方法链接 attr
  • 不过需要检查无效的 HTML5 标签
  • 需要进行更多的解析逻辑更改
  • node.to_html 在这里工作就像一个魅力所以我能够在 db
  • 中存储完整的 HTML