2009-02-12 7 views
8

Je suis en train de récupérer une image spécifique d'un document html, en utilisant pack agilité html et ce XPath:attribut Sélection des valeurs avec le langage HTML Agility Pack de

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

Pour autant que je peux voir, il trouve le src -attribute, mais retourne l'img-tag. Pourquoi donc?

Je m'attendrais à ce que InnerHtml/InnerText ou quelque chose soit défini, mais les deux sont des chaînes vides. OuterHtml est défini sur l'img-tag complet.

Existe-t-il une documentation pour Html Agility Pack?

Répondre

11

Html Agility Pack does not support sélection d'attribut.

+5

Je l'ai juste utilisé pour sélectionner tous les divs où l'attribut align est positionné au centre. "// div [@ align = 'center']" – clamchoda

+0

Il est possible avec une solution de contournement, s'il vous plaît voir ma réponse ci-dessous. –

15

Vous pouvez directement saisir l'attribut si vous utilisez le HtmlNavigator à la place.

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

Bien que cela fonctionne pour lire la valeur de l'attribut, il n'est pas possible de le modifier. L'appel de '.SetValue (" new_value ")' sur le noeud d'attribut sélectionné renvoie une exception 'System.NotSupportedException' puisque le' HtmlNodeNavigator' renvoyé est ** en lecture seule **. – Andre

+0

Cette réponse n'est-elle pas en contradiction directe avec la réponse acceptée (la modification ne faisait pas partie de la question)? –

+0

@DavidS.Je suppose que l'OP n'a jamais dérangé la commutation depuis que j'ai ajouté cette réponse environ 4 ans plus tard –

7

Vous pouvez utiliser la méthode "GetAttributeValue".

Exemple:

//[...] 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

lecture et écriture avec des attributs Html Agility Pack de

Vous pouvez lire et définir les attributs dans HtmlAgilityPack. Cet exemple sélectionne la balise < html> et sélectionne l'attribut 'lang' (language) s'il existe, puis lit et écrit dans l'attribut 'lang'.

Dans l'exemple ci-dessous, le doc.LoadHtml (this.All), "this.All" est une représentation sous forme de chaîne d'un document html.

Lire et écrire:

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

Lecture seule:

  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

J'utilisé de la façon suivante pour obtenir les attributs d'une image.

var MainImageString = MainImageNode.Attributes.Where(i=> i.Name=="src").FirstOrDefault(); 

Vous pouvez spécifier le nom de l'attribut pour obtenir sa valeur; Si vous ne connaissez pas le nom de l'attribut, indiquez un point d'arrêt après avoir récupéré le noeud et visualisé ses attributs en le survolant.

J'espère avoir aidé.