我正在使用 HtmlAgilityPack 解析大约 200,000 个 HTML 文档。
我无法预测这些文件的内容,但是其中一份文件导致我的申请失败并出现以下错误:StackOverflowException
。该文档包含以下 HTML:
<ol>
<li><li><li><li><li><li>...
</ol>
大约有10,000个<li>
像这样嵌套的元素。由于 HtmlAgilityPack 解析 HTML 的方式,它会导致StackOverflowException
.
不幸的是,StackOverflowException 在 .NET 2.0 及更高版本中无法捕获。
我确实想知道为线程堆栈设置更大的大小,但是设置更大的堆栈大小是一种黑客行为:它会导致我的程序使用更多的内存(我的程序启动大约 50 个线程来处理 HTML,所以所有这些线程堆栈大小会增加),如果再次遇到类似情况,则需要手动调整。
我还可以采用其他解决方法吗?
我刚刚修复了一个错误,我认为该错误与您所描述的相同。已将补丁上传到 hap 项目站点...
http://www.codeplex.com/site/users/view/sjdirect http://www.codeplex.com/site/users/view/sjdirect(参见 2012 年 3 月 8 日的补丁)
或者在此处查看有关问题和结果的更多文档......
https://code.google.com/p/abot/issues/detail?id=77 https://code.google.com/p/abot/issues/detail?id=77
实际的修复是...添加了 HtmlDocument.OptionMaxNestedChildNodes,可以设置它来防止由大量嵌套标签引起的 StackOverflowExceptions。它将抛出一个 ApplicationException 并显示消息“文档有超过 X 个嵌套标签。这可能是由于页面未正确关闭标签。”
补丁后我如何使用 Hap...
HtmlDocument hapDoc = new HtmlDocument();
hapDoc.OptionMaxNestedChildNodes = 5000;//This is what was added
string rawContent = GETTHECONTENTHERE
try
{
hapDoc.LoadHtml(RawContent);
}
catch (Exception e)
{
//Instead of a stackoverflow exception you should end up here now
hapDoc.LoadHtml("");
_logger.Error(e);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)