¿Cómo se analiza una cadena HTML para que las etiquetas de imagen obtengan la información de SRC?

StackOverflow https://stackoverflow.com/questions/138839

  •  02-07-2019
  •  | 
  •  

Pregunta

Actualmente uso .Net WebBrowser.Document.Images () para hacer esto. Requiere el Webrowser para cargar el documento. Es desordenado y ocupa recursos.

De acuerdo a esta pregunta XPath es mejor que una expresión regular en esto.

¿Alguien sabe cómo hacer esto en C #?

¿Fue útil?

Solución

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

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

Otros consejos

El gran problema con cualquier análisis HTML es el " bien formado " parte. Ya has visto el crap HTML, ¿cuánto está realmente bien formado? Necesitaba hacer algo similar: analizar todos los enlaces en 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 de código 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 de blog original

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

Si es un xhtml válido, puedes hacer esto:

XmlDocument doc = new XmlDocument();
doc.LoadXml(html);
XmlNodeList results = doc.SelectNodes("//img/@src");
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top