【问题标题】:Get an Element in a deep stack of Html Elements在 Html 元素的深层堆栈中获取一个元素
【发布时间】:2015-08-31 21:31:41
【问题描述】:

我正在使用 C# 中的WebBrowser 对象导航到一个网站,我想获得一个存在于该网站中的 Html 元素,但该元素位于其他元素的丑陋堆栈中,实际上地址是:

html -> frameset -> frame#mainFrame -> html -> body -> div -> table#AutoNumber -> tbody -> tr -> td -> div -> form#lglform -> table -> tbody - > tr -> td -> table -> tbody -> tr -> td -> input#Button1

当我尝试使用 GetElementsByTagName("input") 时,我意识到我必须先找到它的父母,为此我也必须找到它的父母,依此类推。
有没有办法定义一个 HtmlElement 并将其直接设置为该元素而无需通过所有父母?

更新
由于GetElementById,我得到了null,因为WebBrowser 没有正确加载网站,即使我使用DocumentCompleted 事件来确保这里是网站在ie 检查器中的样子:

但是 WebBrowser 对象只是加载这个 HTML


有没有办法让WebBrowser对象收集所有的HTML代码?
或者还有其他实现我目标的好方法吗?

【问题讨论】:

  • @GuillaumeBeauvois 我试过 GetElementById 结果为空
  • 你能提供一些代码吗?你确定 DOM 结构和 id / class 值吗?
  • @GuillaumeBeauvois 我找到了 null 的原因,并为您添加了更多信息
  • 我真的不知道我不是网站开发人员,我只是想使用webBrowser 对象来填充一些文本字段并在页面中按下按钮并以编程方式获取结果。

标签: c# html asp.net .net


【解决方案1】:

由于您输入的 ID 为 Button1,因此请使用 GetElementById。如果做不到这一点,您将不得不查询 webBrowser.Document.All,它是 HTML 文档中所有元素的集合。

HtmlElement input = webBrowser1.Document.GetElementById("Button1");

【讨论】:

  • 感谢您的回答,我尝试了 GetElementByID,但结果为空。你能告诉我如何从那个 html 页面获取所有元素及其子元素吗?
  • @MasihAkbari 当然,使用webBrowser.Document.All,这是对所有元素的访问。
  • 如果元素存在很奇怪你得到空。我对 webBrowser 控制器不是很熟悉,但即使文档没有完全创建,您也可能正在搜索。也许使用WebBrowser.OnDocumentCompleted 来确保所有内容都已加载?
  • @mattytommo 问题是WebBrowser 没有正确加载页面我添加了一些更多的信息
【解决方案2】:

您可以使用 HtmlAgilitypack 并通过其 ID Button1 获取元素:

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(/*html data here*/);
var InputButton = doc.GetElementbyId("Button1");

//Edit: 1 不知何故忽略了您使用网络浏览器控件的事实,mattytommo 的答案在这里似乎更容易和合适。

【讨论】:

  • 框架已经包含GetElementById,你不需要HtmlAgilityPack :)
  • 是的。我完全忽略了网络浏览器控件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-28
  • 2018-05-02
  • 1970-01-01
  • 1970-01-01
  • 2019-05-20
  • 1970-01-01
  • 2015-10-02
相关资源
最近更新 更多