Допустим, имеется простой файл модуля module1.py, содержащий единственную функцию:

1
2
def printer(x):
    print x

Мы можем использовать его, выполнив инструкции import или from. Инструкции сначала отыскивают нужный модуль, при необходимости компилируют его и запускают код.

import загрузит module1.py целиком, поэтому для вызова функции модуля необходимо явно указать ее принадлежность:

1
2
import module1  # Загрузка модуля полностью
module1.printer(“Привет, мир!)

Аналогично осуществляется доступ к любым именам верхнего уровня импортированного модуля.

from же копирует отдельные имена в текущее пространство, что избавляет нас от явного указания имени источника:

1
2
from module1 import printer   # Копирование одной переменной
printer(“Привет, мир!)

Инструкция from * скопирует все имена:

1
2
from module1 import *   # Копирование всех переменных
printer(“Привет, мир!)

Немного оффтопика: Последний месяц интенсивно изучаю Python и технологии с ним связанные (в частности в качестве рабочей ОС стал использовать Ubuntu 10.04). Решил после года фриланса уйти в офис. Да и пора уже, остался последний курс университета :)

Итак, напишем парсер, который будет получать все ссылки на изображения для нужной страницы и выводить их на консоль.

Код парсера с комментариями:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#!/usr/bin/python
# -*- coding: utf-8 -*-
import re, urllib2, sys, BaseHTTPServer

# Проверяем адрес, введенный пользователем
def parseURL(input):
        if input[:7] != "http://":
                if input.find("://") != -1:
                        print "Ошибка: Введите верный URL! Протокол должен быть HTTP!"
                        sys.exit(1)
                else:
                        input = "http://" + input
        return input

# Функция с обработкой исключений, которые могут возникнуть при открытии адреса
def retrieveWebPage(address):
    # Два основных типа:
    # 1. HTTPError - веб-сервер возвращает код ошибки;
    # 2. URLError - ошибка протокола или сети.
    try:
        web_handle = urllib2.urlopen(address)
    except urllib2.HTTPError, e:
        # Смотрим в соответствующем словаре по коду ошибки её описание
        error_desc = BaseHTTPServer.BaseHTTPRequestHandler.responses[e.code][0]
        #print "Не удается получить URL: " + str(e.code) + ": " + error_desc
        print "Не удается получить URL: HTTP Error Code", e.code
        sys.exit(1)
    except urllib2.URLError, e:
        print "Не удается получить URL: " + e.reason[1]
        sys.exit(1)
    except:
        print "Не удается получить URL: неизвестная ошибка"
        sys.exit(1)
    return web_handle

# Если пользователь запустил скрипт без аргумента, показать ему пример
if len(sys.argv) < 2:
        print "Для парсинга необходим URL! Пример использования скрипта:"
        print "%s http://podcode.ru" % (sys.argv[0])
        sys.exit(1)

# Создаем множество - контейнер для объектов
match_set = set()

# Используем описанные выше функции для чтения кода веб-страницы
address = parseURL(sys.argv[1])
website_handle = retrieveWebPage(address)
website_text = website_handle.read() # сохраняем код в переменную

dir = website_handle.geturl().rsplit('/',1)[0]
if (dir == "http:/"):
        dir = website_handle.geturl()

# C помощью регулярного выражения ищем в коде страницы все ссылки на картинки
matches = re.findall('<img .*src="(.*?)"', website_text)

# Преобразуем все ссылки на изображения в абсолютные и добавляем результат в множество
for match in matches:
        if match[:7] != "http://":
                if match[0] == "/":
                        slash = ""
                else:
                        slash = "/"
                match_set.add(dir + slash + match)
        else:
                match_set.add(match)

# Создаем список из множества и сортируем его
match_set = list(match_set)
match_set.sort()

# Выводим результаты на консоль
for item in match_set:
        print item
# P.S. При желании можно организовать сохранение ссылок/изображений в БД/файл/папку.

Итог работы скрипта на примере моего блога (поток вывода я перенаправил в файл img.txt):

P.S. Рекомендую новичкам к прочтению:

Wiki

Книга «Изучаем Python, 3 издание»

Блог на Хабре

мая 31, 2010Speed Dial в Opera 10

Уже пару месяцев в связи со спецификой работы активно использую Linux (Ubuntu 10.04). Некоторое количество популярных Windows — приложений портировано на данную платформу, и это радует.

На днях установил Opera — свой любимый браузер. Настройки элементов Speed Dial, как всем известно, ограничены — можно выбрать максимум расположение 5×5. В Windows эта проблема решалась добавлением в C:\Program Files\Opera\speeddial.ini строк:

[Size]
Total=28
Rows=4
Columns=7

В Ubuntu я начал искать такой же файл. В итоге:

/home/login/.opera/speeddial.ini

Я не люблю начинать изучение какой-либо технологии по блогам и информации в интернете. Отправной точкой для меня всегда является хорошая книга. Так в случае с Ruby on Rails ей стала «Simply Rails 2». Причем, я сначала пытался прочесть всем известный бестселлер "Гибкая разработка веб-приложений в среде Rails" от создателя «Рельсов», но на 150 странице бросил это дело. Не понравился стиль изложения материала. Возможно, стоило читать именно в оригинале...

Цена — 40$ (около 1200 руб.).

На Ruby и Rails я начал писать совсем недавно. Поэтому стало интересно, что именно должен знать «правильный» рубист/рельсовик. Задал вопрос на SO. Вольный перевод ответов привожу ниже.

Начинающий разработчик:

  • Создание и установка Rails окружения
  • Использование генераторов для создания моделей, контроллеров и миграций
  • Работа с миграциями для управления БД
  • Unit-тесты с использованием RSpec и пр.
  • Понимание запросов GET, POST при работе с моделью, контроллером и представлением
  • Основы HTML, CSS и JavaScript
  • Основы GIT

P.S. Дополнения и замечания приветствуются как на SO, так и в комментах.

Вчера зарелизилась новая версия Убунты. Данное событие меня очень порадовало, т.к. в последнее время заинтересовался программированием на языках Ruby, Python и пришлось выбирать среди большого количества дистрибутивов Линукса. Долго не думал и поселил пару недель назад на своем ноутбуке самый популярный (Ubuntu 9.10). Переустанавливать и настраивать систему с нуля не хотелось, поэтому обновился. Пока «полет» нормальный.


Страница 3 из 20123451020...Последняя »

© 2009 PodCode – IT-заметки | Powered by Wordpress