Expresión regular para extraer la URL de un enlace HTML

Soy un novato en Python. Estoy aprendiendo expresiones regulares, pero necesito ayuda aquí.

Aquí viene la fuente HTML:

http://www.ptop.se 

Estoy intentando codificar una herramienta que solo imprime http://ptop.se . ¿Puedes ayudarme por favor?

Si solo estás buscando uno:

 import re match = re.search(r'href=[\'"]?([^\'" >]+)', s) if match: print match.group(0) 

Si tiene una cadena larga y desea cada instancia del patrón en ella:

 import re urls = re.findall(r'href=[\'"]?([^\'" >]+)', s) print ', '.join(urls) 

Donde s es la cadena en la que estás buscando coincidencias.

Explicación rápida de los bits de expresión regular:

r'...' es una cadena “sin procesar”. Te impide tener que preocuparte por escapar de los personajes tanto como lo harías normalmente. ( \ especialmente – en una cadena sin formato a \ es solo una \ . En una cadena normal tendrías que hacer \\ cada vez, y eso se vuelve antiguo en las expresiones regulares).

href=[\'"]? “dice que coincida con” href = “, posiblemente seguido de un ' o " . “Posiblemente” porque es difícil decir cuán horrible es el HTML que estás viendo, y las citas no son estrictamente necesarias.

Si se incluye el siguiente bit en ” () “, se dice que es un “grupo”, lo que significa dividirlo y devolvérnoslo por separado. Es solo una forma de decir “esta es la parte del patrón que me interesa”.

[^\'" >]+ “dice que coincida con cualquier carácter que no sea ' , " , > , o un espacio. Esencialmente, esta es una lista de caracteres que terminan con la URL. Nos permite evitar intentar escribir una expresión regular que coincida de manera confiable con una URL completa, lo que puede ser un poco complicado.

La sugerencia en otra respuesta para usar BeautifulSoup no es mala, pero sí introduce un nivel más alto de requisitos externos. Además, no te ayuda en tu objective declarado de aprender expresiones regulares, lo cual asumo que este proyecto de análisis de HTML específico es solo una parte de.

Es bastante fácil de hacer:

 from BeautifulSoup import BeautifulSoup soup = BeautifulSoup(html_to_parse) for tag in soup.findAll('a', href=True): print tag['href'] 

Una vez que haya instalado BeautifulSoup, de todos modos.

No uses expresiones regulares, usa BeautifulSoup . Eso, o ser tan engorroso como para generarlo, digamos, w3m / lynx y retroceder en lo que hace w3m / lynx. El primero es probablemente más elegante, el segundo simplemente funcionó mucho más rápido en un código no optimizado que escribí hace un tiempo.

Esto debería funcionar, aunque podría haber formas más elegantes.

 import re url='http://www.ptop.se' r = re.compile('(?<=href=").*?(?=")') r.findall(url) 

John Gruber (quien escribió Markdown, que está hecho de expresiones regulares y se usa aquí en Stack Overflow) realizó una producción regular que reconoce las URL en el texto:

http://daringfireball.net/2009/11/liberal_regex_for_matching_urls

Si solo desea capturar la URL (es decir, no está intentando analizar el HTML), esto podría ser más ligero que un analizador de HTML.

Las expresiones regulares son fundamentalmente malas para analizar HTML (consulte ¿Puede proporcionar algunos ejemplos de por qué es difícil analizar XML y HTML con una expresión regular? Para qué). Lo que necesitas es un analizador de HTML. Consulte ¿Puede proporcionar un ejemplo de análisis de HTML con su analizador favorito? para ejemplos usando una variedad de analizadores.

En particular, querrá ver las respuestas de Python: BeautifulSoup , HTMLParser y lxml .

Hay toneladas de ellos en regexlib

Sí, hay toneladas de ellos en regexlib . Eso solo prueba que los RE no deberían usarse para hacer eso. Use SGMLParser o BeautifulSoup o escriba un analizador, pero no use RE’s. Los que parecen funcionar son extremadamente complicados y aún no cubren todos los casos.

Esto funciona bastante bien con el uso de coincidencias opcionales (imprime después de href= ) y solo obtiene el enlace. Probado en http://pythex.org/

 (?:href=['"])([:/.Az?<_&\s=>0-9;-]+) 

Oputput:

Match 1. / wiki / Main_Page

Match 2. / wiki / Portal: Contenidos

Match 3. / wiki / Portal: Featured_content

Match 4. / wiki / Portal: Current_events

Match 5. / wiki / Special: Aleatorio

Match 6. //donate.wikimedia.org/wiki/Special:FundraiserRedirector?utm_source=donate&utm_medium=sidebar&utm_campaign=C13_en.wikipedia.org&uselang=en

Esta expresión regular puede ayudarlo, debe obtener el primer grupo por \ 1 o cualquier método que tenga en su idioma.

 href="([^"]*) 

ejemplo:

 amgheziName 

resultado:

 http://www.amghezi.com 

Puedes usar esto.

 ]+href=["'](.*?)["']