Допустим, имеется простой файл модуля 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 издание»
Блог на Хабре
Уже пару месяцев в связи со спецификой работы активно использую 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). Переустанавливать и настраивать систему с нуля не хотелось, поэтому обновился. Пока «полет» нормальный.
