2009-02-12 11 views
8

Estoy tratando de recuperar una imagen específica de un documento HTML, usando html paquete de agilidad y este XPath:Selección de valores de atributos HTML con agilidad Paquete

//div[@id='topslot']/a/img/@src 

Por lo que yo puedo ver, se encuentra el src -tribuir, pero devuelve la etiqueta-img. ¿Porqué es eso?

Esperaría que se establezca InnerHtml/InnerText o algo así, pero ambas son cadenas vacías. OuterHtml se establece en la etiqueta img completa.

¿Hay alguna documentación para Html Agility Pack?

Respuesta

11

Html Agility Pack does not support selección de atributo.

+5

Acabo de usarlo para seleccionar todos los divs donde la alineación de atributos se establece en el centro. "// div [@ align = 'center']" – clamchoda

+0

Es posible con una pequeña solución, por favor vea mi respuesta a continuación. –

15

Usted puede agarrar directamente el atributo si se utiliza el HtmlNavigator lugar.

//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; 
+1

Si bien esto funciona para leer el valor del atributo, no es posible modificarlo. Llamar a '.SetValue (" new_value ")' en el nodo de atributo seleccionado arroja una 'System.NotSupportedException' ya que' HtmlNodeNavigator' devuelto es ** de solo lectura **. – Andre

+0

¿No es esta respuesta una contradicción directa con la respuesta aceptada (la modificación no fue parte de la pregunta)? –

+0

@DavidS.Supongo que el OP nunca se molestó en cambiarlo ya que agregué esta respuesta aproximadamente 4 años después –

7

Puede utilizar 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); 
} 
1

lectura y escritura Atributos con HTML agilidad Paquete

Puede leer y establecer los atributos de 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.

leer y escribir:

  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 
       } 
      } 

sólo 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; 
       } 
      } 
0

que utilizó 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.

Cuestiones relacionadas