Tratando de analizar un documento HTML y extraer algunos elementos (cualquier enlace a archivos de texto).Analizando documento HTML: ¿Expresión regular o LINQ?
La estrategia actual es cargar un documento HTML en una cadena. Luego encuentre todas las instancias de enlaces a archivos de texto. Podría ser cualquier tipo de archivo, pero para esta pregunta, es un archivo de texto.
El objetivo final es tener una lista IEnumerable
de objetos de cadena. Esa parte es fácil, pero analizar la información es la pregunta.
<html>
<head><title>Blah</title>
</head>
<body>
<br/>
<div>Here is your first text file: <a href="http://myServer.com/blah.txt"></div>
<span>Here is your second text file: <a href="http://myServer.com/blarg2.txt"></span>
<div>Here is your third text file: <a href="http://myServer.com/bat.txt"></div>
<div>Here is your fourth text file: <a href="http://myServer.com/somefile.txt"></div>
<div>Thanks for visiting!</div>
</body>
</html>
Los enfoques iniciales son:
- carga de la cadena en un documento XML y lo atacan de manera LINQ to XML.
- crear una expresión regular, para buscar una cadena que comienza con
href=
, y terminando con.txt
la pregunta que:
- lo que haría que la mirada de expresiones regulares como? Soy un novato de expresiones regulares, y esto es parte de mi aprendizaje de expresiones regulares.
- qué método usarías para extraer una lista de etiquetas?
- cuál sería la forma más eficaz?
- qué método sería el más legible/mantenible?
Actualización: Felicitaciones a Matthew sobre la sugerencia HTML agilidad paquete. ¡Funcionó bien! La sugerencia de XPath también funciona. Desearía poder marcar ambas respuestas como "La respuesta", pero obviamente no puedo. Ambas son soluciones válidas para el problema.
Aquí es una aplicación de consola de C# usando la expresión regular sugerido por Jeff. Lee bien la cadena, y no incluirá ningún href que no termine con .txt. Con la muestra dada, NO incluye correctamente el archivo .txt.snarg
en los resultados (como se proporciona en la función de cadena HTML).
using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;
using System.IO;
namespace ParsePageLinks
{
class Program
{
static void Main(string[] args)
{
GetAllLinksFromStringByRegex();
}
static List<string> GetAllLinksFromStringByRegex()
{
string myHtmlString = BuildHtmlString();
string txtFileExp = "href=\"([^\\\"]*\\.txt)\"";
List<string> foundTextFiles = new List<string>();
MatchCollection textFileLinkMatches = Regex.Matches(myHtmlString, txtFileExp, RegexOptions.IgnoreCase);
foreach (Match m in textFileLinkMatches)
{
foundTextFiles.Add(m.Groups[1].ToString()); // this is your captured group
}
return files;
}
static string BuildHtmlString()
{
return new StringReader(@"<html><head><title>Blah</title></head><body><br/>
<div>Here is your first text file: <a href=""http://myServer.com/blah.txt""></div>
<span>Here is your second text file: <a href=""http://myServer.com/blarg2.txt""></span>
<div>Here is your third text file: <a href=""http://myServer.com/bat.txt.snarg""></div>
<div>Here is your fourth text file: <a href=""http://myServer.com/somefile.txt""></div>
<div>Thanks for visiting!</div></body></html>").ReadToEnd();
}
}
}
¿Está abierto a usar un analizador HTML de código abierto? – Jeff
@JD: ¡absolutamente! Como sugirió Matthew, el HTML Agility Pack suena digno de ver. ¿Ibas a sugerir eso u otro? –
@Philoushka Iba a sugerir HTML Agility Pack ... se mece. – Jeff