La source HTML est la suivante
<img id="itemImage" src="https://www.xyz.com/item1.jpg">
J'utilise la requête LINQ suivante pour obtenir la valeur SRC (Image Link)
string imageURL = document.DocumentNode.Descendants("img")
.Where(node => node.Attributes["id"] != null && node.Attributes["id"].Value == "itemImage")
.Select(node => node.Attributes["src"].Value).ToString();
Mais l’imageURL donne comme résultat
System.Linq.Enumerable+WhereSelectEnumerableIterator`2[HtmlAgilityPack.HtmlNode,System.String]
Le problème est de le lancer en string. Select()
renvoie IEnumerable<T>
ce qui IEnumerable<T>
que vous convertissez un énumérateur en chaîne (comme l'indique le message d'erreur). Appelez First()
ou Single()
ou Take(1)
pour obtenir un seul élément avant de le convertir en chaîne.
.Select(node => node.Attributes["src"].Value).First().ToString();
De même, s'il est possible que l'élément souhaité ne soit pas présent, FirstOrDefault()
et SingleOrDefault()
renvoient null plutôt que de lancer une exception. Dans ce cas, je recommanderais
var imageUlr = ... .Select(node => node.Attributes["src"].Value).FirstOrDefault();
if (imageUrl != null)
{
// cast it to string and do something with it
}
Ajouter .DefaultIfEmpty (string.Empty) .FirstOrDefault
string imageURL = document.DocumentNode.Descendants("img")
.Where(node => node.Attributes["id"] != null && node.Attributes["id"].Value == "itemImage")
.Select(node => node.Attributes["src"].Value)
.DefaultIfEmpty(string.Empty)
.FirstOrDefault()
.ToString();