Análisis de HTML para obtener contenido con C #

Estoy escribiendo una aplicación que rastrea un grupo de mis páginas web. En lugar de tomar todo el código fuente de la página, me gustaría tomar todo el contenido y almacenarlo y poder almacenar la página como texto sin formato dentro de una base de datos. El contenido será utilizado en otras aplicaciones y no leído por los usuarios, por lo que no es necesario que sea perfectamente legible.

Al principio, estaba pensando en usar expresiones regulares, pero no tengo control sobre la validez de las páginas web y hay una gran posibilidad de que ninguna expresión regular me proporcione el contenido.

Si tengo el código fuente dentro de una cadena, ¿cómo puedo convertir esa cadena de código fuente en solo el contenido en C #?

No está 100% claro lo que quieres, pero supongo que quieres el margen de texto negativo; asi que:

string html; // obtain some arbitrary html.... using (var client = new WebClient()) { html = client.DownloadString("http://stackoverflow.com/questions/2038104"); } // use the html agility pack: http://www.codeplex.com/htmlagilitypack HtmlDocument doc = new HtmlDocument(); doc.LoadHtml(html); StringBuilder sb = new StringBuilder(); foreach (HtmlTextNode node in doc.DocumentNode.SelectNodes("//text()")) { sb.AppendLine(node.Text); } string final = sb.ToString(); 

Por favor, ¡ no analices HTML tú mismo! No puede usar solo una expresión regular estándar para analizar HTML, no es posible.

Hay toneladas de bibliotecas gratuitas por ahí. Uno de los mejores gratuitos del mundo de .NET es HTML Agility Pack .

HTML Agility Pack también admite documentos mal formados, que es algo que una expresión regular u otro análisis básico como XML casi nunca hará.

La función siguiente le ayudará a eliminar todas las tags HTML, scripts, css, estilos de la cadena html y convertirla en texto sin formato. ver fuente

 private string GetPlainTextFromHtml(string htmlString) { string htmlTagPattern = "<.*?>"; var regexCss = new Regex("(\\)|(\\)", RegexOptions.Singleline | RegexOptions.IgnoreCase); htmlString = regexCss.Replace(htmlString, string.Empty); htmlString = Regex.Replace(htmlString, htmlTagPattern, string.Empty); htmlString = Regex.Replace(htmlString, @"^\s+$[\r\n]*", "", RegexOptions.Multiline); htmlString = htmlString.Replace(" ", string.Empty); return htmlString; } 

Escribí código para quitar el texto sin formato del marcado y lo presento en mi artículo Convertir HTML a texto . El código presentado es bastante simple y ligero.

También escribí un analizador de HTML liviano y lo publiqué en Github como HTML Monkey . Esta sería una solución más completa y sería una tarea sencilla convertir el marcado analizado para obtener solo el texto. Todavía estoy trabajando en este proyecto y estoy buscando comentarios sobre cómo funciona.