Estoy intentando analizar HTML y no sé cómo usar las condiciones (por ejemplo, el nombre de la clase debe ser X). Sé que hay muchos temas sobre el paquete de agilidad, pero no encontré ninguno de ellos útil.
<div class="main-class">
<a href="LINK">
<img src="IMAGELINK" alt="SOMETEXT" class="image-class">
</a>
</div>
<p> bla bla </p>
<div class="main-class">
<a href="LINK">
<img src="IMAGELINK" alt="SOMETEXT" class="image-class">
</a>
</div>
<div class="main-class">
<a href="LINK">
<img src="IMAGELINK" alt="SOMETEXT" class="image-class">
</a>
<p> asd sadh awww </p>
</div>
Quiero obtener href, src y alt para cada div con nombre de clase "clase principal". Este es mi código, pero solo imprime "p", ya que eso es lo único que sé hacer.
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(dataString);
foreach (HtmlNode nodeItem in doc.DocumentNode.Descendants("p").ToArray())
{
Debug.WriteLine(nodeItem.InnerText);
}
Estoy trabajando en la aplicación WP donde "SelectNodes" no es compatible
Mediante el uso de forma tradicional no XPath.
Nota: Comprobación de valores nulos capaces omitidos.
string dataString = "<div class=\"main-class\"><a href=\"LINK\"><img src=\"IMAGELINK\" alt=\"SOMETEXT\" class=\"image-class\"></a></div><p> bla bla </p><div class=\"main-class\"><a href=\"LINK\"><img src=\"IMAGELINK\" alt=\"SOMETEXT\" class=\"image-class\"></a></div><div class=\"main-class\"><a href=\"LINK\"><img src=\"IMAGELINK\" alt=\"SOMETEXT\" class=\"image-class\"></a><p> asd sadh awww </p></div>";
var doc = new HtmlDocument();
doc.LoadHtml(dataString);
var elements = doc.DocumentNode.Descendants("div").Where(o => o.GetAttributeValue("class", "") == "main-class");
foreach (var nodeItem in elements)
{
var aTag = nodeItem.Descendants("a").First();
var aTagHrefValue = aTag.Attributes["href"];
var imgTag = nodeItem.Descendants("img").First();
var imgTagSrcValue = imgTag.Attributes["src"];
var imgTagAltValue = imgTag.Attributes["alt"];
Console.WriteLine("a href value: {0}", aTagHrefValue.Value);
Console.WriteLine("img src value: {0}", imgTagSrcValue.Value);
Console.WriteLine("img alt value: {0}", imgTagAltValue.Value);
Console.WriteLine();
}
Puedes usar LINQ para eso
var attrs = doc.DocumentNode
.Descendants("div")
.Where(d => d.Attributes != null &&
d.Attributes.Contains("class") &&
d.Attributes["class"].Value.Contains("main-class"))
.Select(d => new
{
anchor = d.SelectSingleNode("a"),
img = d.SelectSingleNode("a") != null
? d.SelectSingleNode("a").SelectSingleNode("img")
: null
})
.Select(d => new
{
href = d.anchor != null
? d.anchor.GetAttributeValue("href", string.Empty)
: string.Empty,
imgsrc = d.img != null
? d.img.GetAttributeValue("src", string.Empty)
: string.Empty,
imgalt = d.img != null
? d.img.GetAttributeValue("alt", string.Empty)
: string.Empty
})
.ToList();