2010-12-04 13 views

Respuesta

40

Python tiene a library for parsing URLs.

import urlparse 
url_data = urlparse.urlparse("http://www.youtube.com/watch?v=z_AbfPXTKms&NR=1") 
query = urlparse.parse_qs(url_data.query) 
video = query["v"][0] 
+0

'Puedo hacer urlparse, pero ¿qué sigue? 'Sí, lo sé, pero el problema es con la parte de consulta. – decarbo

+0

@decarbo La respuesta actualizada muestra cómo extraer solo el valor del parámetro 'v' en la cadena de consulta. – Phrogz

+0

yap, esa es la mejor solución, supongo. – decarbo

2

No hay necesidad de expresiones regulares. Dividir en ?, tomar el segundo, dividir en =, tomar el segundo, dividir en &, tomar el primero.

+0

trabajo. ¿Tiene alguna idea de si este método es lo suficientemente a prueba de balas para ser utilizado sin mayores preocupaciones en proyectos listos para el mercado? – decarbo

+6

usa urlparse para esto. no enrolles los suyos con la división de cadenas o expresiones regulares. http://docs.python.org/library/urlparse.html –

+0

urlparse da consulta en general, así que todavía tengo que dividirlo para obtener ID – decarbo

2

Aquí es algo que se podría tratar de usar expresiones regulares para el ID de vídeo de YouTube:

# regex for the YouTube ID: "^[^v]+v=(.{11}).*" 
result = re.match('^[^v]+v=(.{11}).*', url) 
print result.group(1) 
3
match = re.search(r"youtube\.com/.*v=([^&]*)", "http://www.youtube.com/watch?v=z_AbfPXTKms&test=123") 
if match: 
    result = match.group(1) 
else: 
    result = "" 

No probado.

42

He creado youtube Identificación del analizador sin expresión regular:

def video_id(value): 
    """ 
    Examples: 
    - http://youtu.be/SA2iWivDJiE 
    - http://www.youtube.com/watch?v=_oPAwA_Udwc&feature=feedu 
    - http://www.youtube.com/embed/SA2iWivDJiE 
    - http://www.youtube.com/v/SA2iWivDJiE?version=3&hl=en_US 
    """ 
    query = urlparse(value) 
    if query.hostname == 'youtu.be': 
     return query.path[1:] 
    if query.hostname in ('www.youtube.com', 'youtube.com'): 
     if query.path == '/watch': 
      p = parse_qs(query.query) 
      return p['v'][0] 
     if query.path[:7] == '/embed/': 
      return query.path.split('/')[2] 
     if query.path[:3] == '/v/': 
      return query.path.split('/')[2] 
    # fail? 
    return None 
+1

Este es ideal para analizar todos los posibles formatos de enlace de YouTube. – Lexo

+0

puede usar 'query.path.startswith ('/ embed /')' para mayor legibilidad. –

+0

La solución anterior funciona bien, excepto en un escenario. https://m.youtube.com/?#/watch?v=683hzaj3oc8 Sería muy útil si también obtuviera una solución para el escenario anterior. –

6

Aquí es de expresiones regulares que cubre estos casos enter image description here

((?<=(v|V)/)|(?<=be/)|(?<=(\?|\&)v=)|(?<=embed/))([\w-]+)

+1

para hacer que esto funcione en python, también tuve que corregir la sintaxis: '((? <= (v | V) /) | (? <= be /) | (? <= (\? | \ &) v =) | (? <= embed /)) ([\ w -] +) '. Esta solución terminó siendo la que manejó la mayoría de los casos. –

+0

@GusE gracias, arreglado – Alex

Cuestiones relacionadas