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