parser parse htmlagilitypack example agility c# xpath html-agility-pack

c# - parse - htmlagilitypack load url



Obtenga un valor de un atributo por XPath y HtmlAgilityPack (3)

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

Mi Html:

<tbody> <tr> <td> <input type="text" name="item" value="10743" readonly="readonly" size="10"/> </td> </tr> </tbody>

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 etiquetas con la respuesta).


puedes obtenerlo .Attributes 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 el atributo directamente si usa 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;


Actualización2 : Aquí hay un ejemplo de código de cómo obtener los valores de los 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 necesitas adaptar este código a tus necesidades, por ejemplo, no modificarás los atributos, sino que att.Value .

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

Seleccionar valores de atributo con html Agility Pack

Su problema probablemente sea un problema de espacio de nombres predeterminado : busque "XPath espacio de nombres predeterminado c #" y encontrará muchas buenas soluciones (sugerencia: use la sobrecarga de SelectNodes() que tiene un argumento XmlNamespaceManager ).

El siguiente código muestra lo que se obtiene para 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("<input value=''novel'' ISBN=''1-861001-57-5''>" + "<title>Pride And Prejudice</title>" + "</input>"); 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 nombre predeterminado :

using System; using System.IO; using System.Xml; public class Sample { public static void Main() { XmlDocument doc = new XmlDocument(); doc.LoadXml("<input xmlns=''some:Namespace'' value=''novel'' ISBN=''1-861001-57-5''>" + "<title>Pride And Prejudice</title>" + "</input>"); 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); } }

La ejecución de esta aplicación produce nuevamente los resultados deseados :

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