在C#中如何通过类或ID获取HTML源代码中的元素?

6
我正在尝试使用C# Windows窗体应用程序根据类或ID名称从HTML源中获取元素。我使用WebClient将源代码放入字符串中,并将其插入到HtmlDocument中使用HTMLAgilityPack。
然而,我发现HTMLAgilityPack的所有示例都是基于标签解析和查找元素。我需要查找特定ID的HTML链接,并检索标记内的值。这种操作是否可行,最有效的方法是什么?我尝试解析ID时遇到了异常。谢谢!
1个回答

8
您可以使用XPath来实现这一点:
HtmlDocument doc = new HtmlDocument();
doc.Load(@"file.htm");

HtmlNode node = doc.DocumentNode.SelectSingleNode("//*[@id=\"my_control_id\"]");
string value = (node == null) ? "Error, id not found" : node.InnerHtml;

以下是对xpath的简要解释:

  • // 表示在路径中搜索所有地方,如果要匹配多个,请使用 SelectNodes
  • * 表示匹配任何类型的节点
  • [] 定义"Predicates",基本上检查相对于此节点的属性
  • [@id=\"my_control_id\"] 表示查找具有名为"id"且值为"my_control_id"的属性的节点

更多参考


谢谢,我应该使用这个而不是HTMLAgilityPack吗?我正在使用HtmlAgilityPack.HtmlDocument定义HtmlDocument。你的代码看起来应该可以工作,但每次尝试执行它时都会出现“对象引用未设置为对象实例”的异常。我似乎不能只使用HtmlDocument doc = new HtmlDocument();因为它说它没有构造函数。 - Drew
我之前使用了HTMLAgilityPack。你有另一个名为HtmlDocument的类吗?或许可以尝试 HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument()。同时,示例已经修改以检查空节点。 - Thymine
非常感谢您的帮助!是的,HtmlAgilityPack就是我一直在使用的HtmlDocument。无论我在html源代码中选择哪个id或类别,节点都明显返回为null,现在我得到了这个错误消息而不是异常,所以这将是我需要解决的最后一点问题。 - Drew
或许看一下 doc.ParseErrors,看看它是否在解析您的页面时出错了? - Thymine
是的,那里似乎有一些内容。我想那会是一个单独的问题。再次感谢,非常有帮助! - Drew
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接