如何检查解析错误

Nokogiri 有点像浏览器,因为即使传入的 HTML 或 XML 格式错误,它也会尝试提供有用的东西。不幸的是,它通常会默默地执行,但我们可以使用 errors 查​​询错误列表 :

require 'nokogiri'

doc = Nokogiri::XML('<node><foo/>')
doc.errors
# => [#<Nokogiri::XML::SyntaxError: 1:13: FATAL: Premature end of data in tag node line 1>]

而,正确的 XML 将导致没有错误:

doc = Nokogiri::XML('<node><foo/></node>')
doc.errors
# => []

这也适用于解析 HTML,但是,因为 HTML 是一种轻松的 XML 形式,Nokogiri 会经常传递丢失的端节点,并且只报告格式错误的节点和更多的病态错误:

doc = Nokogiri::HTML('<html><body>')
doc.errors
# => []

doc = Nokogiri::HTML('<html><body><p')
doc.errors
# => [#<Nokogiri::XML::SyntaxError: 1:15: ERROR: Couldn't find end of Start Tag p>]

如果在解析后找不到可在编辑器中看到的节点,则可能是问题的原因。有时,通过格式化程序传递 HTML 有助于查看嵌套是否有助于揭示问题。

并且,因为 Nokogiri 试图解决问题,但有时无法正确解决问题,因为对软件来说这可能是一件非常困难的事情,我们必须预先处理文件并在交付之前修补线条到 Nokogiri。如何做到这一点取决于文件和问题。它可以从简单地找到一个节点和添加一个尾随的 >,到删除由一个糟糕的抓取例程注入的嵌入式格式错误的标记,所以这取决于程序员如何最好地进行调解。