Форум сайта python.su
0
Добрый день!
Буду благодарен любой помощи, в том числе наводки на лит-ру.
Пример строчки лога:
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. Как привести абракадабру к нормальному виду?
Офлайн
1
1. Обращение к файлу в смысле чтение из файла?
open(pfth_to_file, mode)
2. Текст извлекать с помощью re
Офлайн
0
Спасибо!
Не могли бы Вы подсказать, как перекодировать URL в читабельный вид?
Офлайн
1
Если ссылку читаете из файла, то стоит по-пробовать читать не через open, а через codecs.open. А вообще, не знаю) Стоит поискать.
Офлайн
173
locky_kidhttp://docs.python.org/2/library/urllib.html#urllib.unquote
Не могли бы Вы подсказать, как перекодировать URL в читабельный вид?
Офлайн
0
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'ом впервые.
Офлайн
0
еще возникает вот такая ошибка:
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>
часть логов парсится нормально, но при работе с остальными возникает такая ошибка (выделил черным)
помогите, пожалуйста
Офлайн
857
>>> 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) ['группа+круиз+видео', 'группа круиз видео'] >>>
Офлайн
собственно если всю фигню разбить, то можно как-то так:
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
Офлайн
857
>>> 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'] >>>
Офлайн