Obtenga un valor de un atributo por XPath y HtmlAgilityPack

Tengo un documento HTML y lo analizo con XPath. Quiero obtener un valor de la entrada del elemento, pero no funcionó.

Mi HTML:

       

Mi código:

 using HtmlAgilityPack; HtmlAgilityPack.HtmlDocument doc; HtmlWeb hw = new HtmlWeb(); HtmlNodeCollection node = doc.DocumentNode.SelectNodes("//input/@value"); string s=node[0].InnerText; 

Así que quiero obtener el valor: “10743” (y no me importa obtener otras tags con la respuesta).

Puedes conseguirlo en la colección de .Attributes .

 var doc = new HtmlAgilityPack.HtmlDocument(); doc.Load("file.html"); var node = doc.DocumentNode.SelectNodes("//input") [0]; var val = node.Attributes["value"].Value; //10743 

También puede tomar directamente el atributo si utiliza el HtmlNavigator .

 //Load document from some html string HtmlDocument hdoc = new HtmlDocument(); hdoc.LoadHtml(htmlContent); //load navigator for current document HtmlNavigator navigator = (HtmlNodeNavigator)hdoc.CreateNavigator(); //Get value with given xpath string xpath = "//input/@value"; string val = navigator.SelectSingleNode(xpath).Value; 

Update2 : Aquí hay un ejemplo de código sobre cómo obtener valores de atributos usando Html Agility Pack:

http://htmlagilitypack.codeplex.com/wikipage?title=Examples

  HtmlDocument doc = new HtmlDocument(); doc.Load("file.htm"); foreach(HtmlNode link in doc.DocumentElement.SelectNodes("//a[@href"]) { HtmlAttribute att = link.Attributes["href"]; att.Value = FixLink(att); } doc.Save("file.htm"); 

Obviamente, necesita adaptar este código a sus necesidades; por ejemplo, no modificará los atributos, sino que simplemente utilizará att.Value .


Actualización : También puede ver esta pregunta:

Selección de valores de atributos con html Agility Pack


Lo más probable es que su problema sea un problema de espacio de nombres predeterminado : busque “XPath default namespace c #” y encontrará muchas buenas soluciones (consejo: use la sobrecarga de SelectNodes() que tiene un argumento XmlNamespaceManager ).

El siguiente código muestra lo que se obtiene por un atributo en un documento en “sin espacio de nombres”:

 using System; using System.IO; using System.Xml; public class Sample { public static void Main() { XmlDocument doc = new XmlDocument(); doc.LoadXml("" + "Pride And Prejudice" + ""); XmlNode root = doc.DocumentElement; XmlNode value = doc.SelectNodes("//input/@value")[0]; Console.WriteLine("Inner text: " + value.InnerText); Console.WriteLine("InnerXml: " + value.InnerXml); Console.WriteLine("OuterXml: " + value.OuterXml); Console.WriteLine("Value: " + value.Value); } } 

El resultado de ejecutar esta aplicación es :

 Inner text: novel InnerXml: novel OuterXml: value="novel" Value: novel 

Ahora, para un documento que está en un espacio de nombres predeterminado :

 using System; using System.IO; using System.Xml; public class Sample { public static void Main() { XmlDocument doc = new XmlDocument(); doc.LoadXml("" + "Pride And Prejudice" + ""); XmlNode root = doc.DocumentElement; XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable); nsmgr.AddNamespace("x", "some:Namespace"); XmlNode value = doc.SelectNodes("//x:input/@value", nsmgr)[0]; Console.WriteLine("Inner text: " + value.InnerText); Console.WriteLine("InnerXml: " + value.InnerXml); Console.WriteLine("OuterXml: " + value.OuterXml); Console.WriteLine("Value: " + value.Value); } } 

Ejecutar esta aplicación produce nuevamente los resultados deseados :

 Inner text: novel InnerXml: novel OuterXml: value="novel" Value: novel