【问题标题】:How to grab elements by class or id in HTML Source in C#?如何在 C# 中的 HTML 源代码中按类或 id 抓取元素?
【发布时间】:2011-12-11 01:38:32
【问题描述】:

我正在尝试使用 C# windows 窗体应用程序根据类或 id 名称从 HTML 源中获取元素。我使用 WebClient 将源代码放入字符串中,并使用 HtmlDocument 将其插入 HTMLAgilityPack 中。

但是,我在 HTMLAgilityPack 包中找到的所有示例都会根据标签解析和查找项目。我需要找到一个特定的 id,比如 html 中的链接,然后检索标签内的值。这是可能的吗?最有效的方法是什么?我试图解析ID的一切都给了我例外。谢谢!

【问题讨论】:

    标签: c# html parsing html-agility-pack


    【解决方案1】:

    你应该可以用 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
    • * 表示匹配任何类型的节点
    • [] 定义“谓词”,它们基本上是检查与此节点相关的属性
    • [@id=\"my_control_id\"] 表示查找具有名为“id”且值为“my_control_id”的属性的节点

    Further reference

    【讨论】:

    • 谢谢,我应该用这个代替 HTMLAgilityPack 吗?我正在使用 HtmlAgilityPack.HtmlDocument 定义 HtmlDocument。您的代码很有意义,它应该可以工作,但是每次尝试执行它时,我都会收到“未将对象引用设置为对象的实例”异常。我似乎不能只使用 HtmlDocument doc = new HtmlDocument();因为它说它没有构造函数。
    • 我为此使用了 HTMLAgilityPack。你在某处有另一个名为 HtmlDocument 的类吗?也许尝试HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument() 也编辑示例以检查空节点。
    • 非常感谢您的帮助!是的,HtmlAgilityPack 是我一直在使用的 HtmlDocument。无论我在 html 源代码中选择哪个 id 或类,该节点肯定会返回为 null,我现在收到的是错误消息而不是异常,所以这将是我要弄清楚的最后一点。
    • 也许看看doc.ParseErrors,看看它是否在解析您的页面时出现问题?
    • 是的,那里似乎确实有人居住。我想这将是一个单独的问题。再次感谢,非常有帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-08
    • 2018-04-08
    • 2012-11-29
    • 1970-01-01
    • 1970-01-01
    • 2021-03-25
    相关资源
    最近更新 更多