training-web.ruГлавнаяКатегорииО насКарта сайтаПоискТёмная тема

Категории

Парсинг url при помощи библиотеки urllib.parse Python

Создано: 30 марта 2018Автор: Егор Астапов6029 просмотровСложность: легкий

Дошли руки до парсинга. Я не буду пока показывать вам сложные примеры. Пока сделаем парсинг простого урла средствами urllib.parse. Прикол в том, что многие опытные и не опытные программисты собирают урл примерно так: 'yousite.ru/?' + 'param1=' + str(num1) + '&' + 'param2=' + str(num2). Хорошо если у вас мало параметров. Но если их будет много? Что тогда? Ваша задача быстро научиться: разбирать строку, менять параметры, собирать новый урл с изменёнными параметрами.


#!/usr/bin/python3
#freelance.py

import urllib.parse as urllib

if __name__=='__main__':
    '''
    если вызывается напрямую ./freelance.py, то запускаем скрипт
    '''

    # разбираем url + получаем параметры
    url = 'https://freelance.ru/projects/?cat=4&spec=446'
    base_url = url.split('/?')[0]
    data = url.split('/?')[-1]
    data = urllib.urlparse(url)
    print(base_url)
    #вывод: https://freelance.ru/projects
    query_data = urllib.parse_qs(data.query)
    print(query_data)
    #вывод: {'cat': ['4'], 'spec': ['446']}

    #меняю параметр
    query_data['cat'][0]=str(5)

    '''
    собираем url с изменёнными параметрами
    внимание! в urllib.urlunsplit(5 элементов!!!)
    '''
    new_url = urllib.urlunsplit(('https', 'freelance.ru', '/projects/',\
     'cat='+query_data['cat'][0] + '&spec='+query_data['spec'][0], ''))
    print(new_url)
    '''
    вывод:
    https://freelance.ru/projects/?cat=5&spec=446
    '''
    # верхний способ довольно длинный, оптимизируем сборку get-параметров
    new_url = base_url + '/?' + urllib.urlencode(query_data, doseq=True)
    print(new_url)
    '''
    вывод:
    https://freelance.ru/projects/?spec=446&cat=5
    '''

Функция urllib.urlunsplit имеет одну особенность. Вы должны передавать только пять параметров. Если у вас нет 5 параметров, то ставьте пустоту в качестве значения. Обратите внимание на функцию urllib.urlencode. Она собирает get-параметры (ключ=значение) в одну строку. Сколько бы не было параметров, все они будут обработаны.

Если вам нужно собрать url из частей с разделителем /, то воспользуйтесь функцией join


base_url = 'https://freelance.ru'
new_url = '/'.join([base_url, 'param1', 'param2', 'param3'])
print(new_url)
#вывод: https://freelance.ru/projects/param1/param2/param3

Вы можете подробно прочитать про функции библиотеки urllib.parse на страницах: urllib.parse(docs.python.org) и urllib.parse(ilnurgi1.ru)

Комментарии

реклама