我正在使用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
运行脚本,这是我不想要的。有人可以帮助我摆脱那些错误吗?
答案 0 :(得分:6)
我不知道你是否正在要求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__}
将无法阻止它这样做。
答案 1 :(得分:2)
一种可能的解决方案是安装一个$SIG{__WARN__}
处理程序来过滤消息或者只是静音所有警告:
local $SIG{__WARN__} = sub { /* $_[0] is the message */ };