具有较大 html 数据的 MVC StackOverflowException
MVC StackOverflowException with larger html data
我有以下方法(我正在使用 htmlagilitypack):
public DataTable tableIntoTable(HtmlDocument doc)
{
var nodes = doc.DocumentNode.SelectNodes("//table");
var table = new DataTable("MyTable");
table.Columns.Add("raw", typeof(string));
foreach (var node in nodes)
{
if (
(!node.InnerHtml.Contains("pldefault"))
&& (!node.InnerHtml.Contains("ntdefault"))
&& (!node.InnerHtml.Contains("bgtabon"))
)
{
table.Rows.Add(node.InnerHtml);
}
}
return table;
}
它接受 html 使用此抓取:
public HtmlDocument getDataWithGet(string url)
{
using (var wb = new WebClient())
{
string response = wb.DownloadString(url);
var doc = new HtmlDocument();
doc.LoadHtml(response);
return doc;
}
}
对于 3294 行长的 html 文档,一切正常。
当我给它一些 html 时,它有 33960 行长,我得到:
WhosebugException 在 tableIntoTable 方法中的 IF 语句处未处理,如下图所示:
http://imgur.com/Q2FnIgb
我认为这可能与 MaxHttpCollectionKeys 限制为 1000 有关,所以我尝试将其放入我的 Web.config 但它仍然不起作用:
添加 key="aspnet:MaxHttpCollectionKeys" value="9999"
我不太确定从这里到哪里去,只有更大的 html 文档才会中断。
假设您的 if 语句中的值包含在 table 的某些后代的某些属性值中。
var xpath = @"//table[not(.//*[contains(@*,'pldefault') or
contains(@*,'ntdefault') or
contains(@*,'bgtabon')])]";
var tables = doc.DocumentNode.SelectNodes(xpath);
更新: 根据您的评论更准确:
@"//table[not(.//td[contains(@class,'pldefault') or
contains(@class,'ntdefault') or
contains(@class,'bgtabon')])]";
我有以下方法(我正在使用 htmlagilitypack):
public DataTable tableIntoTable(HtmlDocument doc)
{
var nodes = doc.DocumentNode.SelectNodes("//table");
var table = new DataTable("MyTable");
table.Columns.Add("raw", typeof(string));
foreach (var node in nodes)
{
if (
(!node.InnerHtml.Contains("pldefault"))
&& (!node.InnerHtml.Contains("ntdefault"))
&& (!node.InnerHtml.Contains("bgtabon"))
)
{
table.Rows.Add(node.InnerHtml);
}
}
return table;
}
它接受 html 使用此抓取:
public HtmlDocument getDataWithGet(string url)
{
using (var wb = new WebClient())
{
string response = wb.DownloadString(url);
var doc = new HtmlDocument();
doc.LoadHtml(response);
return doc;
}
}
对于 3294 行长的 html 文档,一切正常。
当我给它一些 html 时,它有 33960 行长,我得到:
WhosebugException 在 tableIntoTable 方法中的 IF 语句处未处理,如下图所示:
http://imgur.com/Q2FnIgb
我认为这可能与 MaxHttpCollectionKeys 限制为 1000 有关,所以我尝试将其放入我的 Web.config 但它仍然不起作用: 添加 key="aspnet:MaxHttpCollectionKeys" value="9999"
我不太确定从这里到哪里去,只有更大的 html 文档才会中断。
假设您的 if 语句中的值包含在 table 的某些后代的某些属性值中。
var xpath = @"//table[not(.//*[contains(@*,'pldefault') or
contains(@*,'ntdefault') or
contains(@*,'bgtabon')])]";
var tables = doc.DocumentNode.SelectNodes(xpath);
更新: 根据您的评论更准确:
@"//table[not(.//td[contains(@class,'pldefault') or
contains(@class,'ntdefault') or
contains(@class,'bgtabon')])]";