uso para img imagenes imagen funciona emplea ejemplo como atributos atributo agregar c# .net html regex xpath

c# - img - ¿Cómo se analiza una cadena HTML para las etiquetas de imagen para obtener información de SRC?



seo imagenes wordpress (4)

Actualmente uso .Net WebBrowser.Document.Images() para hacer esto. Requiere que Webrowser cargue el documento. Es complicado y consume recursos.

Según esta pregunta, XPath es mejor que una expresión regular en este sentido.

Alguien sabe cómo hacer esto en C #?


El gran problema con cualquier análisis de HTML es la parte "bien formada". Has visto la mierda HTML por ahí, ¿cuánto está realmente bien formado? Necesitaba hacer algo similar: analizar todos los enlaces de un documento (y en mi caso) actualizarlos con un enlace reescrito. Encontré el Html Agility Pack en CodePlex. Oscila (y maneja HTML malformado).

Aquí hay un fragmento para iterar sobre enlaces en un documento:

HtmlDocument doc = new HtmlDocument(); doc.Load(@"C:/Sample.HTM"); HtmlNodeCollection linkNodes = doc.DocumentNode.SelectNodes("//a/@href"); Content match = null; // Run only if there are links in the document. if (linkNodes != null) { foreach (HtmlNode linkNode in linkNodes) { HtmlAttribute attrib = linkNode.Attributes["href"]; // Do whatever else you need here } }

Publicación original del blog


Si es xhtml válido, podrías hacer esto:

XmlDocument doc = new XmlDocument(); doc.LoadXml(html); XmlNodeList results = doc.SelectNodes("//img/@src");


Si su cadena de entrada es XHTML válida, puede tratarla como xml, cargarla en un documento xml y hacer magia XPath :) Pero no siempre es así.

De lo contrario, puede probar esta función, que devolverá todos los enlaces de imágenes desde 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 puedes usarlo así:

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()); } }


Si todo lo que necesitas son imágenes, solo usaría una expresión regular. Algo como esto debería hacer el truco:

Regex rg = new Regex(@"<img.*?src=""(.*?)""", RegexOptions.IgnoreCase);