9

Jak wybrać element np. pole tekstowe, jeśli nie znam jego identyfikatora?GetElementsByTagName w pakiecie Htmlagilitypack

ile znam jego id to mogę po prostu napisać:

HtmlAgilityPack.HtmlNode node = doc.GetElementbyId(id); 

Ale nie wiem identyfikator pola tekstowego i nie mogę znaleźć metody getElementsByTagName w HtmlagilityPack która jest dostępna w formantu WebBrowser. W kontroli przeglądarki internetowej Mogłem po prostu napisane:

HtmlElementCollection elements = browser[i].Document.GetElementsByTagName("form"); 
foreach (HtmlElement currentElement in elements) 
{ 

} 

EDIT

Oto formularz HTML mówię

<form id="searchform" method="get" action="/test.php"> 
<input name="sometext" type="text"> 
</form> 

Uwaga Nie wiem identyfikator formy. I może być kilka formularzy na tej samej stronie. Jedyne, co wiem, to "coś" i chcę uzyskać ten element przy użyciu właśnie tego imienia. Sądzę więc, że będę musiał przeanalizować wszystkie formy jeden po drugim, a następnie znaleźć to imię "kiedyś", ale jak mam to zrobić?

+0

dobrze, co wygląda jak HTML? może być inny sposób. – shriek

+0

@shriek Mam edytować moje pytanie, proszę spojrzeć. – Ali

+0

Zobacz http://stackoverflow.com/a/3120867/68607 – TFD

Odpowiedz

26

Jeśli szukasz znacznika przez jego zmiennej (takie jak form dla <form name="someForm">), a następnie można użyć:

var forms = document.DocumentNode.Descendants("form"); 

Jeśli szukasz tagu według jego nazwy (np. someForm dla <form name="someForm">, możesz użyć:

var forms = document.DocumentNode.Descendants().Where(node => node.Name == "formName"); 

Do ostatniego można utworzyć prostą metodę rozszerzenia:

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); 
    } 
} 

Uwaga: Można również użyć SelectNodes i XPath do kwerendy dokument:

var nodes = doc.DocumentNode.SelectNodes("//form//input"); 

dałby Ci wszystkie wejścia na strona, która znajduje się w tagu formularza.

var nodes = doc.DocumentNode.SelectNodes("//form[1]//input"); 

Czy daje wszystkie wejścia pierwszego formularza na stronie

5

myślę szukasz coś takiego

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); 
doc.LoadHtml("...."); 

var inputs = doc.DocumentNode.Descendants("input") 
    .Where(n => n.Attributes["name"]!=null && n.Attributes["name"].Value == "sometext") 
    .ToArray(); 
+0

Mam edytować moje pytanie, proszę spojrzeć. – Ali

+0

@Ali Zaktualizowałem odpowiedź już –

+0

Nie ma potrzeby sprawdzania n.Attributes i wszystkich. Istnieje własność Name. Możesz użyć '.Where (n => n.Name == TheNameYoureLookingFor);' – jessehouwing

5

Każdy węzeł według nazwy:

doc.DocumentNode.SelectNodes("//*[@name='name']") 

węzły wejściowe według nazwy:

doc.DocumentNode.SelectNodes("//input[@name='name']") 
Powiązane problemy