2009-01-31 104 views
29

Soy un novato en Python. Estoy aprendiendo expresiones regulares, pero necesito ayuda aquí.Expresión regular para extraer URL de un enlace HTML

Aquí viene el código HTML:

<a href="http://www.ptop.se" target="_blank">http://www.ptop.se</a> 

Estoy tratando de codificar una herramienta que sólo imprime http://ptop.se. ¿Puedes ayudarme por favor?

+2

duplicado: http: // stackoverflow.com/questions/430966/regex-for-links-in-html-text –

+6

He estado alejado de SO por un tiempo, es bueno ver que no me he perdido nada, y la gente SIGUE preguntando cómo analizar HTML con expresiones regulares cada maldito día. – bobince

+2

@bobince Varias veces al día, es tan malo que he creado dos preguntas a las que puedo redirigir a las personas y una respuesta de formulario que los señala allí. –

Respuesta

13

No utilice expresiones regulares, use BeautifulSoup. Eso, o sea tan complicado como para engendrarlo, digamos, w3m/lynx y retroceder en lo que representa w3m/lynx. Primero es más elegante, probablemente segundo, funcionó muchísimo más rápido en algún código no optimizado que escribí hace un tiempo.

11

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

import re 
url='<a href="http://www.ptop.se" target="_blank">http://www.ptop.se</a>' 
r = re.compile('(?<=href=").*?(?=")') 
r.findall(url) 
+1

(? <= Href = ["']). *? (? = ["']) Se ocupa de href de quoated individual también – SoulMan

60

Si sólo está buscando para uno:

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

Si usted tiene una cadena larga, y quisiera que cada instancia del patrón en ella:

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

Donde es s la cadena que está buscando coincide con.

Explicación rápida de th e bits de expresiones regulares:

r'...' es una cadena "en bruto". Te evita tener que preocuparte por escapar de los personajes tanto como lo harías normalmente. (\ especialmente - en una cadena de texto en un \ es sólo un \ En una cadena normal que tendría que hacer \\ cada vez, y que obtiene de edad en las expresiones regulares..)

"href=[\'"]?" dice para que coincida "href =", posiblemente seguido de ' o ". "Posiblemente" porque es difícil decir qué tan horrible es el HTML que estás mirando, y las comillas no son estrictamente necesarias.

Encerrar el siguiente bit en "()" dice que sea un "grupo", lo que significa dividirlo y devolverlo por separado. Es solo una forma de decir "esta es la parte del patrón que me interesa".

"[^\'" >]+" dice para que coincida con cualquier carácter que no son ', ", >, o un espacio. Básicamente, esta es una lista de personajes que son el final de 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 introduce un nivel más alto de requisitos externos. Además, no te ayuda en tu objetivo declarado de aprender expresiones regulares, que supongo que este proyecto específico de análisis html 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.

+4

Parte del aprendizaje de expresiones regulares es aprender cuando no usarlas, este es un caso en el que no deberías no los usas –

+0

algunas páginas están tan mal formateadas que incluso BeautifulSoup no puede encontrar los enlaces allí. Entonces tienes que recurrir a algo. –

1

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

8

John Gruber (que escribió de rebajas, que está hecha de expresiones regulares y se utiliza aquí en desbordamiento de pila) tenía un ir en la producción de una expresión regular que reconoce las direcciones URL en el texto:

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

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

1

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

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

Oputput:

coincidencia 1./wiki/Main_Page

Partido 2./wiki/Portal: Contenido

Partido 3./wiki/Portal: Featured_content

Coincide 4./wiki/Portal: Current_events

Partido 5./wiki/Especial: Emparejar al Azar

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

+0

Al ingresar esta expresión regular en un programa python (no a través del sitio que usted mencionó) dará un error debido al uso de las comillas de texto '' 'o' "'. Para corregir esto, la expresión regular debería ser: 'regex = '(?: href = [\' "]) ([: /. Az? <_&\s=> 0-9; -] +) '' agregando una inclinación \ antes de' '' o '' '. –

0

esta regex puede ayudarlo, debe obtener el primer grupo por \ 1 o el método que tenga en su idioma.

href="([^"]*) 

ejemplo:

<a href="http://www.amghezi.com">amgheziName</a> 

resultado:

http://www.amghezi.com 
Cuestiones relacionadas