2008-09-26 8 views

Respuesta

51

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

¡Gracias por eso, me estaba golpeando la cabeza con mi propia expresión regular! –

+1

'([^ '" ">] +?)' No funciona si href incluye espacios! – Ahmad

+0

La línea 'using (StreamReader sr = new StreamReader (response.GetResponseStream())' falta un paréntesis de cierre adicional. – Kaitlyn

-3

Si es XHTML, se puede hacer esto:

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

buena suerte de carga del 90% de las páginas html por ahí en un XmlDocument :) –

+0

bastante bueno en esto. HTML no es XML válido. Y arroja una excepción. –

+0

@RobertoBonini eres un experto! – Snickbrack

4

Si todo lo que necesita es imágenes me acaba de utilizar una expresión regular. Algo como esto debe hacer el truco:

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

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

He aquí un fragmento de la iteración a través de 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 
    } 
} 

Original Blog Post

+2

¿Qué es "Contenido"? –

Cuestiones relacionadas