c# - Seleccionar valores de atributo con html Agility Pack
.net xpath (6)
Estoy tratando de recuperar una imagen específica de un documento html, usando html agility pack y este xpath:
//div[@id=''topslot'']/a/img/@src
Por lo que puedo ver, encuentra el atributo src, pero devuelve la etiqueta img. ¿Porqué es eso?
Esperaría que se establezca InnerHtml / InnerText o algo, pero ambas son cadenas vacías. OuterHtml se establece en la etiqueta img completa.
¿Hay alguna documentación para Html Agility Pack?
Html Agility Pack no admite la selección de atributos.
Html Agility Pack lo admitirá pronto.
http://htmlagilitypack.codeplex.com/Thread/View.aspx?ThreadId=204342
Puede usar el método "GetAttributeValue".
Ejemplo:
//[...] code before needs to load a html document
HtmlAgilityPack.HtmlDocument htmldoc = e.Document;
//get all nodes "a" matching the XPath expression
HtmlNodeCollection AllNodes = htmldoc.DocumentNode.SelectNodes("*[@class=''item'']/p/a");
//show a messagebox for each node found that shows the content of attribute "href"
foreach (var MensaNode in AllNodes)
{
string url = MensaNode.GetAttributeValue("href", "not found");
MessageBox.Show(url);
}
Puede utilizar 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
HtmlNodeNavigator navigator = (HtmlNodeNavigator)hdoc.CreateNavigator();
//Get value from given xpath
string xpath = "//div[@id=''topslot'']/a/img/@src";
string val = navigator.SelectSingleNode(xpath).Value;
Lectura y escritura de atributos con Html Agility Pack
Puede leer y establecer los atributos en HtmlAgilityPack. Este ejemplo selecciona la etiqueta <html> y selecciona el atributo ''lang'' (idioma) si existe, y luego lee y escribe en el atributo ''lang''.
En el ejemplo siguiente, el doc.LoadHtml (this.All), "this.All" es una representación de cadena de un documento html.
Lee y escribe:
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(this.All);
string language = string.Empty;
var nodes = doc.DocumentNode.SelectNodes("//html");
for (int i = 0; i < nodes.Count; i++)
{
if (nodes[i] != null && nodes[i].Attributes.Count > 0 && nodes[i].Attributes.Contains("lang"))
{
language = nodes[i].Attributes["lang"].Value; //Get attribute
nodes[i].Attributes["lang"].Value = "en-US"; //Set attribute
}
}
Solo lectura:
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(this.All);
string language = string.Empty;
var nodes = doc.DocumentNode.SelectNodes("//html");
foreach (HtmlNode a in nodes)
{
if (a != null && a.Attributes.Count > 0 && a.Attributes.Contains("lang"))
{
language = a.Attributes["lang"].Value;
}
}
Utilicé la siguiente manera para obtener los atributos de una imagen.
var MainImageString = MainImageNode.Attributes.Where(i=> i.Name=="src").FirstOrDefault();
Puede especificar el nombre del atributo para obtener su valor; si no conoce el nombre del atributo, proporcione un punto de interrupción después de haber buscado el nodo y ver sus atributos al pasar el ratón sobre él.
Espero que haya ayudado.