Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# HTML敏捷包-解析表_C#_Html_Html Parsing_Html Agility Pack - Fatal编程技术网

C# HTML敏捷包-解析表

C# HTML敏捷包-解析表,c#,html,html-parsing,html-agility-pack,C#,Html,Html Parsing,Html Agility Pack,我想使用HTML agility pack解析复杂网页中的表,但不知何故,我迷失在了对象模型中 我查看了链接示例,但没有找到任何这样的表数据。 我可以使用XPath获取表吗?在加载了关于如何获取表的数据之后,我基本上不知所措。我以前在Perl中做过这件事,虽然有点笨拙,但还是奏效了。HTML::TableParser 我也很高兴能为解析正确的对象顺序提供帮助。下面的例子怎么样: 使用 请注意,如果需要,可以使用LINQ to对象使其更美观: var query = from table in d

我想使用HTML agility pack解析复杂网页中的表,但不知何故,我迷失在了对象模型中

我查看了链接示例,但没有找到任何这样的表数据。 我可以使用XPath获取表吗?在加载了关于如何获取表的数据之后,我基本上不知所措。我以前在Perl中做过这件事,虽然有点笨拙,但还是奏效了。HTML::TableParser

我也很高兴能为解析正确的对象顺序提供帮助。

下面的例子怎么样: 使用

请注意,如果需要,可以使用LINQ to对象使其更美观:

var query = from table in doc.DocumentNode.SelectNodes("//table").Cast<HtmlNode>()
            from row in table.SelectNodes("tr").Cast<HtmlNode>()
            from cell in row.SelectNodes("th|td").Cast<HtmlNode>()
            select new {Table = table.Id, CellText = cell.InnerText};

foreach(var cell in query) {
    Console.WriteLine("{0}: {1}", cell.Table, cell.CellText);
}

我发现获取特定元素的XPath最简单的方法是为Firefox安装FireBug扩展。转到站点/网页,按F12打开FireBug;右键选择并右键单击要查询的页面上的元素,然后选择Inspect element Firebug将在其IDE中选择该元素,然后右键单击Firebug中的元素并选择Copy XPath。此函数将为您提供使用HTML Agility Library获取所需元素所需的准确XPath查询。

上一行答复:

HtmlDocument doc = new HtmlDocument();
这在VS 2015 C中不起作用。您不能再构建HtmlDocument了


另一个MS功能使事情更难使用。尝试HtmlAgilityPack.HtmlWeb并查看一些示例代码。

在我的例子中,有一个表恰好是路由器的设备列表。如果希望使用TR/TH/TD行、标题、数据而不是上述矩阵来读取表,可以执行以下操作:

    List<TableRow> deviceTable = (from table in document.DocumentNode.SelectNodes(XPathQueries.SELECT_TABLE)
                                       from row in table?.SelectNodes(HtmlBody.TR)
                                       let rows = row.SelectSingleNode(HtmlBody.TR)
                                       where row.FirstChild.OriginalName != null && row.FirstChild.OriginalName.Equals(HtmlBody.T_HEADER)
                                       select new TableRow
                                       {
                                           Header = row.SelectSingleNode(HtmlBody.T_HEADER)?.InnerText,
                                           Data = row.SelectSingleNode(HtmlBody.T_DATA)?.InnerText}).ToList();
                                       }  
TableRow只是一个简单的对象,以标题和数据作为属性。 该方法考虑了零度,在这种情况下:


我知道这是一个很老的问题,但这是我的解决方案,它帮助可视化了表,这样你就可以创建一个类结构。这也使用了HTML敏捷包

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(@"<html><body><p><table id=""foo""><tr><th>hello</th></tr><tr><td>world</td></tr></table></body></html>");
var table = doc.DocumentNode.SelectSingleNode("//table");
var tableRows = table.SelectNodes("tr");
var columns = tableRows[0].SelectNodes("th/text()");
for (int i = 1; i < tableRows.Count; i++)
{
    for (int e = 0; e < columns.Count; e++)
    {
        var value = tableRows[i].SelectSingleNode($"td[{e + 1}]");
        Console.Write(columns[e].InnerText + ":" + value.InnerText);
    }
Console.WriteLine();
}

请记住,有时浏览器会稍微更改html的DOM,就像在缺少DOM时添加到。默认情况下,Html Agility Pack在解析Html时也不包含和标记。记住这些差异,您将在浏览器和Html Agility Pack之间的XPath兼容性方面取得更大的成功。即使承认Anders提到的缺陷,这也是一个很好的省时方法。不过Firefox似乎不再支持它了:嗨,Mark,您能就解析大文件提出建议吗?超过50 mb的文件,我无法在较大的文件上获取子tr节点。@马克-如果表正在分页,那么如何通过刮取转到下一页?@Dark_Knight您需要点击ajax路由原始页面的任何内容used@MarcGravell我发现这个分页“init'sites',“sites'tbl','/ipID/23.227.38.0/ipIDii/23.227.38.255/sort/6/asc/1',true'1',536',{sortCol:'6',sortAsc:'1'}你知道如何调用该函数吗?对我有用,不知道你在说什么。
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(@"<html><body><p><table id=""foo""><tr><th>hello</th></tr><tr><td>world</td></tr></table></body></html>");
var table = doc.DocumentNode.SelectSingleNode("//table");
var tableRows = table.SelectNodes("tr");
var columns = tableRows[0].SelectNodes("th/text()");
for (int i = 1; i < tableRows.Count; i++)
{
    for (int e = 0; e < columns.Count; e++)
    {
        var value = tableRows[i].SelectSingleNode($"td[{e + 1}]");
        Console.Write(columns[e].InnerText + ":" + value.InnerText);
    }
Console.WriteLine();
}