GetElementsByTagName в Htmlagilitypack
Как выбрать элемент, например textbox, если я не знаю его id?
Если я знаю его идентификатор, то я могу просто написать:
HtmlAgilityPack.HtmlNode node = doc.GetElementbyId(id);
Но я не знаю ID textbox и не могу найти метод GetElementsByTagName в HtmlagilityPack, который доступен в WebBrowser control. В управлении веб-браузером я мог бы просто написать:
HtmlElementCollection elements = browser[i].Document.GetElementsByTagName("form");
foreach (HtmlElement currentElement in elements)
{
}
EDIT
Вот HTML-форма, о которой я говорю
<form id="searchform" method="get" action="/test.php">
<input name="sometext" type="text">
</form>
Пожалуйста, обратите внимание, что я не знаю идентификатор формы. И там может быть несколько форм на одной странице. Единственное, что я знаю, это "sometext", и я хочу получить этот элемент, используя только это имя. Поэтому я предполагаю, что мне придется разобрать все формы по одной, а затем найти это имя "sometext", но как это сделать?
3 ответа:
Если вы ищете тег по его tagName (например,
form
для<form name="someForm">
), то вы можете использовать:var forms = document.DocumentNode.Descendants("form");
Если вы ищете тег по его свойству name (например,
someForm
для<form name="someForm">
, то вы можете использовать:var forms = document.DocumentNode.Descendants().Where(node => node.Name == "formName");
Для последнего вы можете создать простой метод расширения:
Примечание: Вы также можете использоватьpublic static class HtmlNodeExtensions { public static IEnumerable<HtmlNode> GetElementsByName(this HtmlNode parent, string name) { return parent.Descendants().Where(node => node.Name == name); } public static IEnumerable<HtmlNode> GetElementsByTagName(this HtmlNode parent, string name) { return parent.Descendants(name); } }
SelectNodes
и XPath для запроса вашего документа:var nodes = doc.DocumentNode.SelectNodes("//form//input");
Даст вам все входные данные на странице, которые находятся в теге формы.
var nodes = doc.DocumentNode.SelectNodes("//form[1]//input");
Отдал бы вам все входные данные первой формы на странице