gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 08:05:13 24 4
gpt4 key购买 nike

我正在使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com