2009-10-03 21 views
27

C# würde ich gerne wissen, wie die Textbox Wert erhalten (das heißt: john) aus dieser Probe html Skript:Parsing HTML-Seite mit HtmlAgilityPack

<TD class=texte width="50%"> 
<DIV align=right>Name :<B> </B></DIV></TD> 
<TD width="50%"><INPUT class=box value=John maxLength=16 size=16 name=user_name> </TD> 
<TR vAlign=center> 

Antwort

45

Es gibt eine Reihe von Möglichkeiten, Elemente mit dem Agilitätspaket auszuwählen.

Nehmen wir an, wir haben uns definierten HtmlDocument wie folgt:

string html = @"<TD class=texte width=""50%""> 
<DIV align=right>Name :<B> </B></DIV></TD> 
<TD width=""50%""> 
    <INPUT class=box value=John maxLength=16 size=16 name=user_name> 
</TD> 
<TR vAlign=center>"; 

HtmlDocument htmlDoc = new HtmlDocument(); 
htmlDoc.LoadHtml(html); 

1. Einfache LINQ
könnten Wir verwenden die Descendants() Methode, den Namen eines Elements vorbei sind wir auf der Suche nach:

var inputs = htmlDoc.DocumentNode.Descendants("input"); 

foreach (var input in inputs) 
{ 
    Console.WriteLine(input.Attributes["value"].Value); 
    // John 
} 

2. Fortgeschrittenere LINQ
Das könnten wir verengen durch ausgefallenere LINQ mit:

var inputs = from input in htmlDoc.DocumentNode.Descendants("input") 
      where input.Attributes["class"].Value == "box" 
      select input; 

foreach (var input in inputs) 
{ 
    Console.WriteLine(input.Attributes["value"].Value); 
    // John 
} 

3. XPath
Oder wir XPath nutzen könnten.

string name = htmlDoc.DocumentNode 
    .SelectSingleNode("//td/input") 
    .Attributes["value"].Value; 

Console.WriteLine(name); 
//John 
+0

LINQ: In dem Fall, dass das Attribut nicht da war, habe ich die folgende Linq für 'wo input.Attributes [ "class"] = null && input.Attributes [ "class"] Value ==!". Box "' –

2
HtmlDocument doc = new HtmlDocument(); 
doc.LoadHtml(html); 
XPathNavigator docNav = doc.CreateNavigator(); 

XPathNavigator node = docNav.SelectSingleNode("//td/input/@value"); 

if (node != null) 
{ 
    Console.WriteLine("result: " + node.Value); 
} 

ich das ziemlich schnell geschrieben, so dass Sie Ich möchte ein paar Tests mit mehr Daten machen.

HINWEIS: Die XPath-Strings müssen anscheinend in Kleinbuchstaben geschrieben sein.

EDIT: Anscheinend unterstützt die Beta jetzt Linq zu Objekten direkt, so dass es wahrscheinlich keinen Bedarf für den Konverter gibt.