Hay una manera de analizar una URL (con algunas biblioteca de python) y el retorno de una de python diccionario con las claves y los valores de los parámetros de consulta de la URL?

Por ejemplo:

url = "http://www.example.org/default.html?ct=32&op=92&item=98"

retorno esperado:

{'ct':32, 'op':92, 'item':98}

6 Comentarios

  1. 149

    Utilizar el urllib.analizar biblioteca:

    >>> from urllib import parse
    >>> url = "http://www.example.org/default.html?ct=32&op=92&item=98"
    >>> parse.urlsplit(url)
    SplitResult(scheme='http', netloc='www.example.org', path='/default.html', query='ct=32&op=92&item=98', fragment='')
    >>> parse.parse_qs(parse.urlsplit(url).query)
    {'item': ['98'], 'op': ['92'], 'ct': ['32']}
    >>> dict(parse.parse_qsl(parse.urlsplit(url).query))
    {'item': '98', 'op': '92', 'ct': '32'}

    La urllib.parse.parse_qs() y urllib.parse.parse_qsl() métodos de analizar las cadenas de consulta, teniendo en cuenta que las claves pueden ocurrir más de una vez y que la orden de mayo de la materia.

    Si usted todavía está en Python 2, urllib.parse fue llamado urlparse.

    • O import urllib.parse as urlparse para Python3.
    • y para la edad de python (2.4 y anteriores) estas dos funciones se encuentran en el cgi módulo con el mismo nombre
  2. 28

    Para Python 3, los valores de la dict de parse_qs están en una lista, porque puede haber varios valores. Si lo que desea es la primera:

    >>> from urllib.parse import urlsplit, parse_qs
    >>>
    >>> url = "http://www.example.org/default.html?ct=32&op=92&item=98"
    >>> query = urlsplit(url).query
    >>> params = parse_qs(query)
    >>> params
    {'item': ['98'], 'op': ['92'], 'ct': ['32']}
    >>> dict(params)
    {'item': ['98'], 'op': ['92'], 'ct': ['32']}
    >>> {k: v[0] for k, v in params.items()}
    {'item': '98', 'op': '92', 'ct': '32'}
    • Esto no es exclusivo de Python 3, Python 2 urllib.parse_qs también devuelve listas para los valores. Específicamente quiero hablar de esto en mi respuesta, por cierto, puede que desee utilizar urllib.parse_qsl() en su lugar y el pasado de la lista resultante a dict() si usted apenas quiere a los valores individuales.
    • Parece que la diferencia con parse_qls es que desde que se devuelve una lista de tuplas, la conversión de que a un diccionario se mantendrá el última en lugar de primera. Por supuesto, esto supone que hubo varios valores, para empezar.
  3. 9

    Si usted prefiere no utilizar un analizador:

    url = "http://www.example.org/default.html?ct=32&op=92&item=98"
    url = url.split("?")[1]
    dict = {x[0] : x[1] for x in [x.split("=") for x in url[1:].split("&") ]}

    Así que no voy a borrar lo que está por encima, pero definitivamente no es lo que usted debe usar.

    Creo que leer algunas de las respuestas y se veía un poco complicado, en caso que usted es como yo, que no uso mi solución.

    Usar este:

    from urllib import parse
    params = dict(parse.parse_qsl(parse.urlsplit(url).query))

    y para Python 2.X

    from urllib import urlparse as parse

    Sé que este es el mismo que el aceptado respuesta, sólo en una funda que se puede copiar.

    • El análisis implica algo más que la división de la cadena. Usted necesita para controlar la codificación de URL (incluyendo la +), y el urllib.parse también sube o ignora los errores para usted según lo solicitado. No estoy seguro de por qué usted quiere reinventar la rueda, cuando es parte de la biblioteca estándar.
  4. 4

    Para python 2.7

    In [14]: url = "http://www.example.org/default.html?ct=32&op=92&item=98"
    
    In [15]: from urlparse import urlparse, parse_qsl
    
    In [16]: parse_url = urlparse(url)
    
    In [17]: query_dict = dict(parse_qsl(parse_url.query))
    
    In [18]: query_dict
    Out[18]: {'ct': '32', 'item': '98', 'op': '92'}
  5. 3

    Estoy de acuerdo acerca de no reinventar la rueda, pero a veces (mientras estás aprendiendo) que ayuda a construir una rueda con el fin de comprender de una rueda. 🙂 Así que, desde una perspectiva puramente académico, ofrezco este con la advertencia de que el uso de un diccionario se supone que los pares de nombre y valor son únicos (que la cadena de consulta no contener varios registros).

    url = 'http:/mypage.html?one=1&two=2&three=3'
    
    page, query = url.split('?')
    
    names_values_dict = dict(pair.split('=') for pair in query.split('&'))
    
    names_values_list = [pair.split('=') for pair in query.split('&')]

    Yo estoy usando la versión 3.6.5 en el vacío IDE.

  6. 0

    Para python2.7 estoy usando urlparse para parsear de consulta de url dict.

    import urlparse
    
    url = "http://www.example.org/default.html?ct=32&op=92&item=98"
    
    print urlparse.parse_qs( urlparse.urlparse(url).query )
    # result: {'item': ['98'], 'op': ['92'], 'ct': ['32']} 

Dejar respuesta

Please enter your comment!
Please enter your name here