Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 6, 2013 10:08:51

locky_kid
Зарегистрирован: 2013-02-06
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Подскажите, как пропарсить лог такого типа

Добрый день!
Буду благодарен любой помощи, в том числе наводки на лит-ру.

Пример строчки лога:
ms3-002 HTTP_REFERER=http://yandex.ua/yandsearch?p=1&text=%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0+%D0%BA%D1%80%D1%83%D0%B8%D0%B7+%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE&lr=142&tld=ua@@reqid=1295795808784874-823414473724779076058684-7-017-p1@@btt=281@@u=@@reg=142@@cltr=7@@dtype=iweb@@path=231.8@@at=3@@uah=2572539484@@url=http://video.yandex.ru/search.xml?text=%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0%20%D0%BA%D1%80%D1%83%D0%B8%D0%B7%20%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE&where=all&id=15292606-00

Вопросы:
1. Обращение python к файлу .txt
2. Как вычленить данные из поля “text=”?
3. Как привести абракадабру к нормальному виду?

Офлайн

#2 Фев. 6, 2013 11:07:00

warik
Зарегистрирован: 2013-02-06
Сообщения: 23
Репутация: +  1  -
Профиль   Отправить e-mail  

Подскажите, как пропарсить лог такого типа

1. Обращение к файлу в смысле чтение из файла?
open(pfth_to_file, mode)

2. Текст извлекать с помощью re

Офлайн

#3 Фев. 6, 2013 15:45:07

locky_kid
Зарегистрирован: 2013-02-06
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Подскажите, как пропарсить лог такого типа

Спасибо!
Не могли бы Вы подсказать, как перекодировать URL в читабельный вид?

Офлайн

#4 Фев. 6, 2013 17:00:21

warik
Зарегистрирован: 2013-02-06
Сообщения: 23
Репутация: +  1  -
Профиль   Отправить e-mail  

Подскажите, как пропарсить лог такого типа

Если ссылку читаете из файла, то стоит по-пробовать читать не через open, а через codecs.open. А вообще, не знаю) Стоит поискать.

Офлайн

#5 Фев. 6, 2013 17:16:59

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

Подскажите, как пропарсить лог такого типа

locky_kid
Не могли бы Вы подсказать, как перекодировать URL в читабельный вид?
http://docs.python.org/2/library/urllib.html#urllib.unquote

Офлайн

#6 Фев. 6, 2013 23:00:47

locky_kid
Зарегистрирован: 2013-02-06
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Подскажите, как пропарсить лог такого типа

warik и reclosedev, спасибо Вам!
Ваши наводки мне изрядно помогли)

Но тут возникла проблема, мой ламерский код не учел, что логи записываются одной строкой подряд, а именно:

ms3-002 HTTP_REFERER=http://yandex.ru/yandsearch?text=%D0%B0%D0%BD%D1%81%D0%B0%D0%BC%D0%B1%D0%BB%D1%8C%20%D0%B8%D0%BC%D0%BF%D1%83%D0%BB%D1%8C%D1%81%20%D0%B3%20%D1%87%D0%B5%D0%BB%D1%8F%D0%B1%D0%B8%D0%BD%D1%81%D0%BA&clid=40795&lr=56&msp=1@@reqid=1295795800745739-1646521006967082442799851-7-029@@btt=297@@u=@@reg=56@@cltr=7@@dtype=iweb@@path=231.8@@at=3@@uah=359629205@@url=http://video.yandex.ru/search.xml?text=%D0%B0%D0%BD%D1%81%D0%B0%D0%BC%D0%B1%D0%BB%D1%8C%20%D0%B8%D0%BC%D0%BF%D1%83%D0%BB%D1%8C%D1%81%20%D0%B3%20%D1%87%D0%B5%D0%BB%D1%8F%D0%B1%D0%B8%D0%BD%D1%81%D0%BA&where=all&id=64205772-00ms3-002 HTTP_REFERER=http://yandex.ua/yandsearch?p=1&text=%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0+%D0%BA%D1%80%D1%83%D0%B8%D0%B7+%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE&lr=142&tld=ua@@reqid=1295795808784874-823414473724779076058684-7-017-p1@@btt=281@@u=@@reg=142@@cltr=7@@dtype=iweb@@path=231.8@@at=3@@uah=2572539484@@url=http://video.yandex.ru/search.xml?text=%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0%20%D0%BA%D1%80%D1%83%D0%B8%D0%B7%20%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE&where=all&id=15292606-00 и так далее еще очень прилично строчек, в идеале десятки-сотни тысяч (жирным выделил начало и конец каждой строки)

Может быть, кто-нибудь знает, какой функцией из библиотеки re можно тут обойтись? Если с регулярным выражением, то какой его примерно вид? Очень круто было бы иметь возможно вытаскивать подстроку в диапазоне “text=…&” . С такой штукой решились бы все мои проблемы
Может быть, стоит просто расставить переводы строк (\n)? Но опять же как это сделать в нужных местах?

Сам я новичок, и сижу так плотно за python'ом впервые.

Офлайн

#7 Фев. 7, 2013 00:28:59

locky_kid
Зарегистрирован: 2013-02-06
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Подскажите, как пропарсить лог такого типа

еще возникает вот такая ошибка:

Traceback (most recent call last):
File “trop_u2.py”, line 21, in <module>
line = extract(line) #парсим (моя функция обработки строки)
File “trop_u2.py”, line 13, in extract
print(d)
File “c:\python33\lib\encodings\cp866.py”, line 19, in encode
return codecs.charmap_encode(input,self.errors,encoding_map)
UnicodeEncodeError: ‘charmap“ codec can’t encode character '\ufffd” in position
21 : character maps to <undefined>

часть логов парсится нормально, но при работе с остальными возникает такая ошибка (выделил черным)

помогите, пожалуйста

Офлайн

#8 Фев. 7, 2013 01:06:29

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Подскажите, как пропарсить лог такого типа

>>> import re
>>> import urllib.parse
>>> 
>>> s = """ms3-002 HTTP_REFERER=http://yandex.ua/yandsearch?p=1&text=%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0+%D0%BA%D1%80%D1%83%D0%B8%D0%B7+%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE&lr=142&tld=ua@@reqid=1295795808784874-823414473724779076058684-7-017-p1@@btt=281@@u=@@reg=142@@cltr=7@@dtype=iweb@@path=231.8@@at=3@@uah=2572539484@@url=http://video.yandex.ru/search.xml?text=%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0%20%D0%BA%D1%80%D1%83%D0%B8%D0%B7%20%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE&where=all&id=15292606-00"""
>>> 
>>> lst = re.findall(r'text=(.+?)&', urllib.parse.unquote(s))
>>> print(lst)
['группа+круиз+видео', 'группа круиз видео']
>>>



Офлайн

#9 Фев. 7, 2013 01:20:34

dimy44
От: Евпатория
Зарегистрирован: 2012-04-21
Сообщения: 463
Репутация: +  42  -
Профиль  

Подскажите, как пропарсить лог такого типа

собственно если всю фигню разбить, то можно как-то так:

text = """HTTP_REFERER=http:// yandex.ru/yandsearch?text=%D0%B0%D0%BD%D1%81%D0%B0%D0%BC%D0%B1%D0%BB%D1%8C%20%D0%B8%D0%BC%D0%BF%D1%83%D0%BB%D1%8C%D1%81%20%D0B3%20%D1%87%D0%B5%D0%BB% D1%8F%D0%B1%D0%B8%D0%BD%D1%81%D0%BA&clid=40795&lr=56&msp=1@@reqid=1295795800745739-1646521006967082442799851-7-029@@btt=297@@u=@@reg=56@@ cltr=7@@dtype=iweb@@path=231.8@@at=3@@uah=359629205@@url=http://video.yandex.ru/search.xml?text=%D0%B0%D0%BD%D1%81%D0%B0%D0%BC%D0%B1%D0%BB%D1%8C% 20%D0%B8%D0%BC%D0%BF%D1%83%D0%BB%D1%8C%D1%81%20%D0%B3%20%D1%87%D0%B5%D0%BB%D1%8F%D0%B1%D0%B8%D0%BD%D1%81%D0%BA&where=all&id= 64205772-00ms3-002 HTTP_REFERER=http://yandex.ua/ yandsearch?p=1&text=%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0+%D0%BA%D1%80%D1%83%D0%B8%D0%B7+%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE&lr=142&tld=ua@@ reqid=1295795808784874-823414473724779076058684-7-017-p1@@btt=281@@u=@@reg=142@@cltr=7@@dtype=iweb@@path=231.8@@at=3@@uah=2572539484@@url=http://video.yandex.ru/search.xml?text=%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0%20%D0%BA%D1%80%D1%83%D0%B8%D0%B7%20%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE&where=all&id=15 292606-00"""
import re
p = r'((?<=&|\?|@)[a-zA-Z]+=)'
L = []
for t in re.split(p, text):
    L.append(t)
    if not t.endswith('='):
        print ''.join(L)
        L[:] = []
>>>
HTTP_REFERER=http:// yandex.ru/yandsearch?
text=%D0%B0%D0%BD%D1%81%D0%B0%D0%BC%D0%B1%D0%BB%D1%8C%20%D0%B8%D0%BC%D0%BF%D1%83%D0%BB%D1%8C%D1%81%20%D0B3%20%D1%87%D0%B5%D0%BB% D1%8F%D0%B1%D0%B8%D0%BD%D1%81%D0%BA&
clid=40795&
lr=56&
msp=1@@
reqid=1295795800745739-1646521006967082442799851-7-029@@
btt=297@@
u=@@
reg=56@@ cltr=7@@
dtype=iweb@@
path=231.8@@
at=3@@
uah=359629205@@
url=http://video.yandex.ru/search.xml?
text=%D0%B0%D0%BD%D1%81%D0%B0%D0%BC%D0%B1%D0%BB%D1%8C% 20%D0%B8%D0%BC%D0%BF%D1%83%D0%BB%D1%8C%D1%81%20%D0%B3%20%D1%87%D0%B5%D0%BB%D1%8F%D0%B1%D0%B8%D0%BD%D1%81%D0%BA&
where=all&
id= 64205772-00ms3-002 HTTP_REFERER=http://yandex.ua/ yandsearch?
p=1&
text=%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0+%D0%BA%D1%80%D1%83%D0%B8%D0%B7+%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE&
lr=142&
tld=ua@@ reqid=1295795808784874-823414473724779076058684-7-017-p1@@
btt=281@@
u=@@
reg=142@@
cltr=7@@
dtype=iweb@@
path=231.8@@
at=3@@
uah=2572539484@@
url=http://video.yandex.ru/search.xml?
text=%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0%20%D0%BA%D1%80%D1%83%D0%B8%D0%B7%20%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE&
where=all&
id=15 292606-00

Офлайн

#10 Фев. 7, 2013 07:43:54

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Подскажите, как пропарсить лог такого типа

>>> import urllib.parse
>>> 
>>> s = """http://yandex.ua/yandsearch?p=1&text=%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0+%D0%BA%D1%80%D1%83%D0%B8%D0%B7+%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE&lr=142&tld=ua@@reqid=1295795808784874-823414473724779076058684-7-017-p1@@btt=281@@u=@@reg=142@@cltr=7@@dtype=iweb@@path=231.8@@at=3@@uah=2572539484@@url=http://video.yandex.ru/search.xml?text=%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0%20%D0%BA%D1%80%D1%83%D0%B8%D0%B7%20%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE&where=all&id=15292606-00"""
>>> 
>>> uparsed = urllib.parse.urlparse(s)
>>> qvars = urllib.parse.parse_qs(uparsed.query)
>>> 
>>> for name in ('text', 'id'):
...     print(name, '->', qvars[name])
... 
text -> ['группа круиз видео']
id -> ['15292606-00']
>>>



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version