Найти - Пользователи
Полная версия: Подскажите, как пропарсить лог такого типа
Начало » Python для новичков » Подскажите, как пропарсить лог такого типа
1
locky_kid
Добрый день!
Буду благодарен любой помощи, в том числе наводки на лит-ру.

Пример строчки лога:
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. Как привести абракадабру к нормальному виду?
warik
1. Обращение к файлу в смысле чтение из файла?
open(pfth_to_file, mode)

2. Текст извлекать с помощью re
locky_kid
Спасибо!
Не могли бы Вы подсказать, как перекодировать URL в читабельный вид?
warik
Если ссылку читаете из файла, то стоит по-пробовать читать не через open, а через codecs.open. А вообще, не знаю) Стоит поискать.
reclosedev
locky_kid
Не могли бы Вы подсказать, как перекодировать URL в читабельный вид?
http://docs.python.org/2/library/urllib.html#urllib.unquote
locky_kid
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'ом впервые.
locky_kid
еще возникает вот такая ошибка:

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>

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

помогите, пожалуйста
py.user.next
>>> 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)
['группа+круиз+видео', 'группа круиз видео']
>>>
dimy44
собственно если всю фигню разбить, то можно как-то так:
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
py.user.next
>>> 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']
>>>
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB