使用HTMLAgilityPack在评论中填写表

时间:2017-04-24 23:27:30

标签: c# web-scraping html-agility-pack

我想使用HTMLAgilityPack在评论中抓一张桌子。例如,在页面上 http://www.baseball-reference.com/register/team.cgi?id=f72457e4 有一张id="team_pitching"的表格。我可以将此评论作为一个文本块来获取:

var tags = doc.DocumentNode.SelectSingleNode("//comment()[contains(., 'team_pitching')]");

但是我的偏好是从表格中选择行:

var tags = doc.DocumentNode.SelectNodes("//comment()[contains(., 'team_pitching')]//table//tbody//tr");

var tags = doc.DocumentNode.SelectNodes("//comment()//table[@id = 'team_pitching']//tbody//tr");

但这些都返回null。有没有办法做到这一点所以我不必手动解析文本来获取所有的表格数据?

示例HTML - 我正在寻找<!-- ... -->内的节点:

<p>not interesting HTML here</p>
<!-- <table id=team_pitching>
    <tbody><tr>...</tr>...</tbody>...</table> -->

1 个答案:

答案 0 :(得分:1)

评论内容未被解析为DOM节点,因此您无法使用单个XPath搜索外部评论和内部评论。

您可以获取评论节点的InnerHTML,修改评论标记,将其加载到HtmlDocument并对其进行查询。这样的事情应该有效

var commentNode = doc.DocumentNode
    .SelectSingleNode("//comment()[contains(., 'team_pitching')]");
var commentHtml = commentNode.InnerHtml.TrimStart('<', '!', '-').TrimEnd('-', '>');
var commentDoc = new HtmlDocument();
commentDoc.LoadHtml(commentHtml);
var tags = commentDoc.DocumentNode.SelectNodes("//table//tbody//tr");