c# .net xpath html-agility-pack

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?




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.