html - 为什么 XML::LibXML 即使在我禁用它们时仍会继续打印错误?

标签 html perl libxml2 xml-parsing

我正在使用 XML::LibXML 来解析文档。

它背后的 HTML 文件有一些小错误,解析器报告它们:

http://is.gd/create.php?longurl=http://google.com:15: validity error : ID smallink already defined
nal URL was <a href="http://google.com">http://google.com</a><span id="smallink"
                                                                                ^
http://is.gd/create.php?longurl=http://google.com:15: validity error : ID smallink already defined
and use <a href="http://is.gd/fNqtL-">http://is.gd/fNqtL-</a><span id="smallink"
                                                                                ^

但是,我禁用了错误报告:

my $parser = XML::LibXML->new();
$parser->set_options({ recover           => 2,
                       validation        => 0,
                       suppress_errors   => 1,
                       suppress_warnings => 1,
                       pedantic_parser   => 0,
                       load_ext_dtd      => 0, });

my $doc = $parser->parse_html_file("http://is.gd/create.php?longurl=$url");

我抑制这些错误的唯一选择是使用 2>/dev/null 运行脚本,我不希望这样做。有人可以帮助我摆脱这些错误吗?

最佳答案

我不知道您是否正确地要求 XML::LibXML 不打印其警告。我假设你是,这是 XML::LibXML 中的一个错误(你也应该向作者报告),并且只解决如何抑制警告。

每次要打印警告时,perl 都会查找 $SIG{__WARN__} 的值,如果其中包含代码引用,则调用它而不是打印警告本身。

您可以使用它来停止将要忽略的警告打印到 STDERR。但是,您应该小心这一点。确保只抑制误报,而不是所有 警告。警告通常很有用。此外,请确保将 $SIG{__WARN__} 的使用本地化到尽可能小的范围,以避免奇怪的副作用。

# warnings happen just as always
my $parser = ...;
$parser->set_options(...);

{ # in this scope we filter some warnings
    local $SIG{__WARN__} = sub {
        my ($warning) = @_;
        print STDERR $warning if $warning !~ /validity error/;
    };

    $parser->parse_html_file(...);
}

# more code, now the warnings are back to normal again

另请注意,这都是假设这些警告来自 perl-space。很可能 libxml2,C 库 XML::LibXML 在后台使用,将警告直接写入 stderr 本身。 $SIG{__WARN__} 将无法阻止它这样做。

关于html - 为什么 XML::LibXML 即使在我禁用它们时仍会继续打印错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3870032/

相关文章:

javascript - HTML5 音频在某些浏览器中无法工作

遍历 DOM 的 jquery 方法

javascript - 如何通过在 ASP.NET 中选择单选按钮来启用和禁用下拉列表

当主机无法访问时 Perl ssh 错误处理

html - 为什么将鼠标悬停在正常图像后面的图像上?

perl - 可以修补 File::Find::Rule 以自动处理文件名字符编码/解码吗?

linux - 在 block 设备上返回字节偏移量和行匹配表达式?

ruby - Nokogiri 未安装?

php - 从 PHP 执行 shell 命令

python - 在 Mac 上安装 Libxml2