Я изучаю python

вторник, 15 июля 2008 г.

Календарь со ссылками на Python

Для моего текущего проекта потребовалось сделать небольшой HTML-календарик со ссылками.

В Питоне функции для этого нет. То есть, конечно, есть функция formatmonth из стандартного модуля calendar, но она делает календарик без ссылок. А мне надо именно со ссылками.

В интернете есть много разных вариантов календариков, разной степени навороченности. Но все они какие-то уж слишком навороченные.

Для меня самым лучшим вариантом оказалось написание своей функции.
Она форматирует календарик в виде HTML-таблицы и подсвечивает текущий день. Точнее, она добавляет к ячейке с текущей датой специальный CSS-класс, а "подсвечивать" придётся вам, в CSS вашего сайта.

Функция самостоятельно импортирует всё необходимое (функцию formatmonth из модуля calendar).

Нужно лишь вызвать её, например вот так:
format_month_in_html(2008, 7, 15)



А, чуть не забыл, вот сама функция:
# -*- coding: utf-8 -*-

def format_month_in_html(year, month, day):
'''

Форматирует HTML-календарь со ссылками.

Принимает в качестве аргументов год (year), месяц (month) и день (day).

'''

# Названия месяцев
_month_names = ['',
u'Январь',
u'Февраль',
u'Март',
u'Апрель',
u'Май',
u'Июнь',
u'Июль',
u'Август',
u'Сентябрь',
u'Октябрь',
u'Ноябрь',
u'Декабрь'
]

# Названия дней недели и их CSS-классы
_days_names = [# ('День_недели', 'CSS-класс'),
(u'Пн', 'mon'),
(u'Вт', 'tue'),
(u'Ср', 'wed'),
(u'Чт', 'thu'),
(u'Пт', 'fri'),
(u'Сб', 'sat'),
(u'Вс', 'sun')
]

year = int("%04i" % year)
month = int("%02i" % month)
smonth = int("%01i" % month)
day = int("%02i" % day)
sday = int("%01i" % day)

from calendar import monthcalendar

matrix = monthcalendar(year, month)

pre_str = "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"month\">"

pre_str += "<tr><th colspan=\"7\" class=\"month\">" + _month_names[smonth] + "</th></tr>"

pre_str += "<tr>"
for day_name, class_name in _days_names:
pre_str += "<th class=\"%s\">%s</th>" % (class_name, day_name)

pre_str += "</tr>"

for list in matrix:
pre_str += "<tr>"

for nday in list:
if nday == 0:
pre_str += "<td class=\"cld noday\"> </td>"
elif nday == sday:
pre_str += "<td class=\"cld ac-\">" + str(nday) + "</td>"
else:
pre_str += "<td class=\"cld\"><a href=\"/events/" + str("%02i" % month) + "/" + str("%02i" % nday) + "/" + "\">" + str(nday) + "</a></td>"

pre_str += "</tr>"

pre_str += "</table>"

return pre_str

вторник, 12 февраля 2008 г.

Коды ошибок веб-сервера

Ошибки ВЕБ-сервера делятся на диапазоны:
  • 100-199 Информационный. Сообщает агенту что, запрос агента принят и обрабатывается

  • 200-299 Запрос агента обработан успешно, сервер отправил клиенту запрашиваемый документ

  • 300-399 Запрос агента изменен и агенту нужно предпринять некоторые действия для удовлетворения измененного запроса.

  • 400-499 Проблемы при попытке выполнить запрос.

  • 500-599 Ошибки сервера

В диапазоне определены лишь несколько кодов, хотя для сервера при необходимости могут определяться собственные коды. При получении кода, который не может распознать, агент интерпретирует его в соответствии с диапазоном, к которому этот код принадлежит. Коды в диапазонах 100-199, 200-299 и 300-399 большинство Web-броузеров обрабатывают без извещения пользователя, а некоторые коды ошибок из диапазонов 400-499, 500-599 отображаются для пользователя.

ошибка 100 Continue
Начальная часть запроса принята, и клиент может продолжать передачу запроса.

ошибка 101 Switching Protocols
Сервер выполняет требование клиента и переключает протоколы в соответствии с указанием, данным в поле заголовка Upgrade.

ошибка 200 OK
Запрос клиента обработан успешно и ответ сервера содержит затребованные данные.

ошибка 201 Created
Этот код состояния используется в случае создания нового URI. Вместе с этим кодом результата сервер выдает заголовок Location, который содержит информацию о том, куда были помещены новые данные.

ошибка 202 Accepted
Запрос принят, но обрабатывается не сразу. В теле содержимого ответа сервера может быть дана дополнительная информация о данной транзакции. Гарантии того, что сервер в конечном итоге удовлетворит запрос, нет, даже несмотря на то, что на момент приема запрос выглядел допустимым.

ошибка 203 Non-Authoritative Information
Информация в заголовке содержимого взята из локальной копии или у третьей стороны, а не с исходного сервера.

ошибка 204 No Content
Ответ содержит код состояния и заголовок, но тело содержимого отсутствует. При получении этого ответа броузер не должен обновлять свой документ. Обработчик чувствительных областей изображений может возвращать этот код, когда пользователь щелкает на бесполезных или пустых участках изображения.

ошибка 205 Reset Content
Броузер должен очистить форму, используемую в данной транзакции, для дополнительных входных данных. Полезен для CGI-приложений, требующих ввода данных.

ошибка 206 Partial Content
Сервер возвращает лишь часть данных затребованного объема. Используется в ответе на запрос с указанием заголовка Range. Сервер должен указать диапазон, включенный в ответ, в заголовке Content-Range.

ошибка 300 Multiple Choices
Затребованный URI обозначает более одного ресурса. Например, URI может обозначать документ, переведенный на несколько языков. В теле содержимого, возвращенном сервером, может находиться перечень более конкретных данных о том, как выбрать ресурс правильно.

ошибка 301 Moved Permanently
Затребованный URI уже не используется сервером, и указанная в запросе операция не выполнена. Новое местонахождение затребованного документа указывается в заголовке Location (см. настройки файла .htaccess). Во всех последующих запросах данного документа следует указывать новый URI.

ошибка 302 Moved Temporarily
Затребованный URI перемешен, но лишь временно. Заголовок Location указывает на новое местонахождение. Сразу же после получения этого кода состояния клиент должен разрешить запрос при помощи нового URI (см. настройки файла .htaccess), но во всех последующих запросах необходимо пользоваться старым URI.

ошибка 303 See Other
Затребованный URI можно найти по другому URI, указанному в заголовке Location (см. настройки файла .htaccess). Его следует выбрать методом GET по данному ресурсу.

ошибка 304 Not Modified
Это код ответа на заголовок lf-Modified-Since, если URI не изменялся с указанной даты. Тело содержимого не посылается, и клиент должен использовать свою локальную копию.

ошибка 305 Use Proxy
Доступ к затребованному URI должен осуществляться через proxy-сервер, указанный в заголовке Location.

ошибка 400 Bad Request
Означает, что сервер обнаружил в запросе клиента синтаксическую ошибку.

ошибка 401 Unauthorized
Этот код результата, передаваемый с заголовком WWW-Authenticate, показывает, что пославший запрос пользователь не имеет необходимых полномочий и что при повторении запроса с указанием данного URI пользователь должен такие полномочия предоставить.

ошибка 402 Payment Required
Этот код в HTTP еще не реализован.

ошибка 403 Forbidden
Запрос отклонен по той причине, что сервер не хочет (или не имеет возможности) ответить клиенту.

Возможные причины ошибки:
  • Вы пытаетесь запустить CGI-скрипт, расположенный вне CGI-директории (например, в директории документов сервера www).
  • Можно запускать скрипты из www-директории только если в ней есть файл .htaccess (с точкой в начале) следующего содержания: Options +ExecCGI
  • Возможно, вы пытаетесь открыть картинку или статический HTML-файл, расположенный в CGI-директории. Этого делать нельзя. Все рисунки (а также другие файлы, за исключениям скриптов) должны находиться в www-директории.
  • Если вы ожидаете получить листинг каталога, но выводится эта ошибка, вероятно, для данной директории выдача листинга запрещена (например, это CGI-папка). Для разрешения листинга в нужной директории должен находиться файл .htaccess следующего содержания: Options +Indexes

ошибка 404 Not Found

Документ по указанному URL не существует. Возможно, такой файл удален, а возможно, вы ошиблись при наборе URL в браузере или пошли по неверной ссылке.

ошибка 405 Method Not Allowed
Этот код выдается с заголовком Allow и показывает, что метод, используемый клиентом, для данного URL не поддерживается.

Возможно, вы пытаетесь отправить данные POST-форму на страницу, которая не является скриптом (например, на SHTML-страницу). Проверьте путь в атрибуте action тэга , инициировавшего данный запрос. Проверьте также, не пуст ли этот атрибут (и задан ли).

ошибка 406 Not Acceptable
Ресурс, указанный клиентом по данному URL, существует, но не в том формате, который нужен клиенту. Вместе с этим кодом сервер выдает заголовки Content-Language, Content-Encoding и Content-Type.

ошибка 407 Proxy Authentication Required
Proxy-сервер должен санкционировать запрос перед тем, как пересылать его. Используется с заголовком Proxy-Authenticate.

ошибка 408 Request Time-out
Этот код ответа означает, что клиент не передал полный запрос в течение некоторого установленного промежутка времени (который обычно задается в конфигурации сервера) и сервер разрывает сетевое соединение.

ошибка 409 Conflict
Данный запрос конфликтует с другим запросом или с конфигурацией сервера. Информацию о конфликте следует возвратить в информационной части ответа.

ошибка 410 Gone
Данный код показывает, что затребованный URL больше не существует и навсегда удален с сервера.

ошибка 411 Length Required
Сервер отказывается принимать запрос без определенного Content-Length.

ошибка 412 Precondition Failed
Результат вычисления условия, заданного в запросе одним или несколькими заголовками if... , представляет собой "ложь".

ошибка 413 Request Entity Too Large
Сервер не будет обрабатывать запрос, потому что его содержание слишком велико.

ошибка 414 Request URL Too Long
Сервер не будет обрабатывать запрос, потому что его URL слишком длинный.

ошибка 415 Unsupported Media Type
Сервер не будет обрабатывать запрос, потому что его тело имеет неподдерживаемый формат.

ошибка 416 Requested Range Not Satisfiable
Сервер сообщает - форма запроса (требуемый диапазон) не выполнима.

ошибка 417 Expectation Failed
Сервер сообщает - время ожидания истекло.

ошибка 500 Internal Server Error
При обработке запроса на сервере один из его компонентов (например, CGI-программа) выдал аварийный отказ или столкнулся с ошибкой конфигурации. Причиной этого могут быть неправильные инструкции в файле .htaccess, неправильные атрибуты на CGI-скрипте (должны быть 755). Так же, это может быть ошибка в скрипте. Точную причину можно установить, просматривая error.log.

ошибка 501 Not Implemented
Клиент запросил выполнение действия, которое сервер выполнить не может.

ошибка 502 Bad Gateway
Сервер (или proxy-сервер) получил недопустимые ответы другого сервера (или proxy-сервера)

ошибка 503 Service Unavailable
Данный код означает, что данная служба временно недоступна, но в будущем доступ к ней будет восстановлен. Если сервер знает, когда это произойдет, может быть также выдан заголовок Retry-After.

ошибка 504 Gateway Time-out
Этот ответ похож на 408 (Request Time-out), за исключением того, что шлюз или уполномоченный сервер превысил лимит времени.

ошибка 505 HTTP Version not supported
Версия HTTP не поддерживается данным сервером.

воскресенье, 10 февраля 2008 г.

Читаем из интернета веб-страницу, затем сохраняем ее и текст из нее

Скрипт еще не до конца закончен, немного не корректно удаляет лишнее из страницы (остается не только текст, но и немного мусора).

# -*- coding: cp1251 -*-

# читаем из интернета веб-страницу, адрес которой передается
# в качестве первого параметра при запуске скрипта
# на выходе получаем три файла:
# page.html - файл в который пишется веб-страница как она есть
# text.txt - файл в который пишется текст с веб-страницы (без тегов)
# clear-text.txt - как и предыдущий файл, но без пустых строк

import urllib, re, string, sys

url2 = sys.argv[1]
url = "http://" + url2
filename = "page.html" # имя файла в который пишется веб-страница
filename2 = "text.txt" # имя файла в который пишется текст с веб-страницы
filename3 = "clear-text.txt" # текст без пустых строк

f1 = urllib.urlopen(url)
f2 = open(filename, "w")
for line in f1.readlines():
    f2.write(line)
f2.close()
f1.close()
# файл прочитали и записали
print "файл прочитали и записали"

f=open(filename, 'r+')
s = f.read()
f.close()
s2 = re.sub('<.*?>', '', s)
s3 = re.sub('"', '', s2)
s4 = re.sub(' ', ' ', s3)
s5 = re.sub('—', '-', s4)
# убрали все теги
print "убрали все теги"

f3=open(filename2, "w")
f3.write(s5)
f3.close()
# записали без тегов
print "записали без тегов"

f1 = open(filename2, "r")
f2 = open(filename3, "w")
for line in f1.readlines():
    if (re.search('\w', line)):
        f2.write(line)
f2.close()
# удалили все пустые строки
print "удалили все пустые строки"

Из текстового файла создаем файл с гиперссылками

Из текстового файла с названиями статей, создаем файл с гиперссылками с этими названиями:


# -*- coding: cp1251 -*-

# получаем из файла с заголовками страниц, файл с
# гиперсссылками. Например: было "Моя статья", стало
# <a href="01.php">Моя статья</a><br><br>
# у входного файла: одна строка - один заголовок статьи.

import sys, re, string
filename = "1.txt" # файл из которого берутся строки
filename2 = "2.html" # файл куда записываются обработаные строки

# открываем файлы, первый на чтение, второй на запись
f1 = open(filename, "r")
f2 = open(filename2, "w")

a = 49 # начальное значение номеров ссылок

for line in f1.readlines():
    s2 = re.sub('\n', '', line)
    s = "<a href=\"0" + str(a) + ".php\">" + s2 + "</a><br><br>\n"
    f2.write(s)
    a = a + 1

# все сделано, закрываем файлы
f2.close()
f1.close()