C # Regex: obtener URL y texto de varias etiquetas "a href"

Quiero poder extraer una página web que contenga varios "<a href"-etiquetas y devuelve una colección estructurada de ellas.

<div>
    <p>Lorem ipsum... <a href="https://stackoverflow">Classic link</a>
        <a title="test" href=http://sloppy-html-5-href.com>I lovez HTML 5</a>
    </p>
    <a class="abc" href='/my-tribute-to-javascript.html'>I also love JS</a>
    <iframe width="420" height="315" src="http://www.youtube.com/embed/JVPT4h_ilOU"
        frameborder="0" allowfullscreen></iframe><!-- Don't catch me! -->
</div>

Entonces quiero estos valores:

Como puede ver, solo se deben capturar los valores en "a href", con enlace y contenido dentro de las etiquetas. Debe ser compatible con todos los HTML 5 válidos. href. Los atributos href se pueden rodear con cualquier otro atributo.

Así que básicamente quiero una expresión regular para completar el siguiente código:

public IEnumerable<Tuple<string, string>> GetLinks(string html) {
     string pattern = string.Empty; // TODO: Get solution from Stackoverflow
     var matches = Regex.Matches(html, pattern);

     foreach(Match match in matches) {
         yield return new Tuple<string, string>(
             match.Groups[0].Value, match.Groups[1].Value);
     }
}

preguntado el 08 de noviembre de 11 a las 10:11

"TODO: Obtenga una solución de Stackoverflow" - ¿En realidad? ¿Qué tal "TODO: Trate de encontrar una solución y si me quedo atascado, verifique StackOverflow"? -

@nnnnnn Entendido, no se permiten bromas ... comentario muy constructivo. -

Mis disculpas, por supuesto que se permite bromear. En mi estado de falta de sueño, no me di cuenta de que era una broma o no habría publicado ese comentario. (A veces publico comentarios de tipo "¿Qué has intentado hasta ahora?", Pero para ser justos, tu pregunta proporciona muchos detalles de tus requisitos y algo de código, por lo que no se ajusta al perfil habitual de "haz mi trabajo por mí". preguntas.) -

2 Respuestas

¿No es más fácil de usar? paquete de agilidad html y xpath? que regex

sería como

var webGet = new HtmlWeb();
var document = webGet.Load(url); 
var aNodeCollection = document.DocumentNode.Descendants("//a[@href]")

foreach (HtmlNode node id aNodeCollection)
{
node.Attributes["href"].value
node.htmltext
}

su pseudo código

respondido 08 nov., 11:14

Enfoque interesante, pero dice específicamente HTML 5, que no es necesariamente XML válido. - Seb Nilsson

Todavía no tengo tiempo para sumergirme en html5, así que no sabía que permite documentos mal formados (parece un paso atrás) pero aún lo intentaría, el paquete de agilidad funcionó bien para mí incluso con htmls desagradables, los desinfecta bastante bien - WKordos

Siempre he leído que analizar Html con expresión regular es lo malo. Ok ... seguramente es cierto ...
Pero al igual que el mal, las expresiones regulares son muy divertidas :)
Así que le daría una oportunidad a este:

Regex r = new Regex(@"<a.*?href=(""|')(?<href>.*?)(""|').*?>(?<value>.*?)</a>");

foreach (Match match in r.Matches(html))
    yield return new Tuple<string, string>(
        match.Groups["href"].Value, match.Groups["value"].Value);

respondido 08 nov., 11:14

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.