Si su cadena de entrada es válido XHTML se puede tratar es como XML, cargarlo en un XmlDocument, y hacer magia XPath :) Pero no es siempre el caso.
De lo contrario puede probar esta función, que devolverá todos los enlaces de imagen de HtmlSource:
public List<Uri> FetchLinksFromSource(string htmlSource)
{
List<Uri> links = new List<Uri>();
string regexImgSrc = @"<img[^>]*?src\s*=\s*[""']?([^'"" >]+?)[ '""][^>]*?>";
MatchCollection matchesImgSrc = Regex.Matches(htmlSource, regexImgSrc, RegexOptions.IgnoreCase | RegexOptions.Singleline);
foreach (Match m in matchesImgSrc)
{
string href = m.Groups[1].Value;
links.Add(new Uri(href));
}
return links;
}
Y se puede utilizar de esta manera:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.example.com");
request.Credentials = System.Net.CredentialCache.DefaultCredentials;
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
if (response.StatusCode == HttpStatusCode.OK)
{
using(StreamReader sr = new StreamReader(response.GetResponseStream()))
{
List<Uri> links = FetchLinksFromSource(sr.ReadToEnd());
}
}
¡Gracias por eso, me estaba golpeando la cabeza con mi propia expresión regular! –
'([^ '" ">] +?)' No funciona si href incluye espacios! – Ahmad
La línea 'using (StreamReader sr = new StreamReader (response.GetResponseStream())' falta un paréntesis de cierre adicional. – Kaitlyn