在网络浏览器中获取完整的输入标签字符串
Getting complete input tag string in webbrowser
我不得不在一个小应用程序中使用 webbrowser 控件来不填写字段值,而是提取它们,我想做的是获取完整的输入字符串,例如:
<input type="text" name="username" class="form-control" size="40" required="required"/>
我通过使用知道:
foreach (HtmlElement element in webBrowser.Document.GetElementsByTagName("input"))
{
Helpers.ReturnMessage(element.GetAttribute("name"));
}
我们可以使用上面的代码获取 name="username"
部分的值,但是有没有办法获取整个字符串,在本例中为:
<input type="text" name="username" class="form-control" size="40" required="required"/>
理想情况下,我想要做的是从每个 input
-> name="username"
中获取这一部分,在某些示例中它可能是 id="value"
,所以我无法对其进行硬编码,或者我需要使用某种正则表达式吗?感谢您的帮助。
好像HtmlElement doesn't provide any capabilities to enumerate attributes(at least in a generic enough way) so the simplest solution will be to use its OuterHtml property and parse it with https://html-agility-pack.net/
var inputHtml = _webBrowser
.Document
.GetElementsByTagName("input")
.Cast<HtmlElement>()
.Single()
.OuterHtml;
var elementHtmlDoc = new HtmlAgilityPack.HtmlDocument();
elementHtmlDoc.LoadHtml(inputHtml);
var attributesDictionary = elementHtmlDoc
.DocumentNode
.ChildNodes
.Single()
.Attributes
.ToDictionary(
attr => attr.Name,
attr => attr.Value);
MessageBox.Show(
String.Join(Environment.NewLine, attributesDictionary),
"Attributes");
如果您确实需要获取该元素的属性 HTML 字符串,则可以(不理想但仍然 mostly reliable in this case)通过元素的 OuterHtml 上的一些正则表达式来完成
var attributesString = Regex
.Match(inputHtml, @"^<\s*\S+\s+(?<attributes>[^\>]*)>") // WebBrowser removes closing slash, so we do not need to handle it.
.Groups["attributes"]
.ToString();
虽然它不会是 actual HTML 使用的(因为 WebBrowser 似乎重新排列了原始属性并提供了稍微修改的 HTML)。因此,如果您想获得实际的 HTML,那么您将必须分别获得原始的 .html 文件(显然不适用于 SPA 和 Ajax-heavy 站点)并解析它与 HtmlAgilityPack.
我不得不在一个小应用程序中使用 webbrowser 控件来不填写字段值,而是提取它们,我想做的是获取完整的输入字符串,例如:
<input type="text" name="username" class="form-control" size="40" required="required"/>
我通过使用知道:
foreach (HtmlElement element in webBrowser.Document.GetElementsByTagName("input"))
{
Helpers.ReturnMessage(element.GetAttribute("name"));
}
我们可以使用上面的代码获取 name="username"
部分的值,但是有没有办法获取整个字符串,在本例中为:
<input type="text" name="username" class="form-control" size="40" required="required"/>
理想情况下,我想要做的是从每个 input
-> name="username"
中获取这一部分,在某些示例中它可能是 id="value"
,所以我无法对其进行硬编码,或者我需要使用某种正则表达式吗?感谢您的帮助。
好像HtmlElement doesn't provide any capabilities to enumerate attributes(at least in a generic enough way) so the simplest solution will be to use its OuterHtml property and parse it with https://html-agility-pack.net/
var inputHtml = _webBrowser
.Document
.GetElementsByTagName("input")
.Cast<HtmlElement>()
.Single()
.OuterHtml;
var elementHtmlDoc = new HtmlAgilityPack.HtmlDocument();
elementHtmlDoc.LoadHtml(inputHtml);
var attributesDictionary = elementHtmlDoc
.DocumentNode
.ChildNodes
.Single()
.Attributes
.ToDictionary(
attr => attr.Name,
attr => attr.Value);
MessageBox.Show(
String.Join(Environment.NewLine, attributesDictionary),
"Attributes");
如果您确实需要获取该元素的属性 HTML 字符串,则可以(不理想但仍然 mostly reliable in this case)通过元素的 OuterHtml 上的一些正则表达式来完成
var attributesString = Regex
.Match(inputHtml, @"^<\s*\S+\s+(?<attributes>[^\>]*)>") // WebBrowser removes closing slash, so we do not need to handle it.
.Groups["attributes"]
.ToString();
虽然它不会是 actual HTML 使用的(因为 WebBrowser 似乎重新排列了原始属性并提供了稍微修改的 HTML)。因此,如果您想获得实际的 HTML,那么您将必须分别获得原始的 .html 文件(显然不适用于 SPA 和 Ajax-heavy 站点)并解析它与 HtmlAgilityPack.