使用 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
我有一个 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