在一堆深嵌套的HTML元素中获取一个元素

3
我正在使用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并直接设置为该元素,而不必通过所有父级?

更新
由于WebBrowser没有正确加载网站,即使我使用DocumentCompleted事件确保了这一点,所以我得到了一个空的GetElementById结果。以下是在IE检查器中网站的样子:

website in ie

但是,WebBrowser对象只加载了这个HTML:

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


@GuillaumeBeauvois 我尝试使用 GetElementById,但结果为空。 - dev-masih
你能提供一点代码吗?你确定DOM结构和id/class的值吗? - Guillaume Beauvois
@GuillaumeBeauvois 我找到了获取 null 的原因,并为您添加了更多信息。 - dev-masih
我真的不知道,我不是网站开发者,我只是试图使用 webBrowser 对象来填写一些文本字段,点击页面上的按钮并通过编程方式获取结果。 - dev-masih
2个回答

1

由于您的输入具有 Button1 的 ID,因此请使用 GetElementById。但如果失败了,您将不得不查询 webBrowser.Document.All,这是 HTML 文档中所有元素的集合。

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

谢谢你的答案,我尝试了通过GetElementByID方法获取元素,但结果为空。请问你能告诉我如何获取该HTML页面上所有元素及其子元素吗? - dev-masih
@MasihAkbari,好的,请使用“webBrowser.Document.All”,那是访问所有元素的方法。 - Mathew Thompson
如果元素存在,你得到 null 就很奇怪了。我对 WebBrowser 控制器不是很熟悉,但也许你正在搜索即使文档没有完全创建的情况下。也许使用 WebBrowser.OnDocumentCompleted 来确保一切都已加载? - Guillaume Beauvois
@mattytommo 的问题是 WebBrowser 无法正确加载页面,我会添加更多相关信息。 - dev-masih

0
你可以使用HtmlAgilitypack,通过Id Button1 获取元素:
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(/*html data here*/);
var InputButton = doc.GetElementbyId("Button1");

//编辑:1不知何故忽略了您正在使用 WebBrowser 控件,mattytommo 的答案在这里似乎更易于实现和适合。


这个框架已经包含了 GetElementById,所以你不需要使用 HtmlAgilityPack :) - Mathew Thompson
是的,我完全忽略了WebBrowser控件。 - Marco

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