2015-01-29 5 views
2

У меня есть функция python, которая выводит строки, подобные THIS.Каков наиболее эффективный способ извлечения строки из строки?

if (X1079) { clearTimeout (X1079); X1079 = null; } 
X781 ('<FORM name="X58" method="POST" action="http://us21.chatzy.com/56024939146241"><DIV style="display:none;"><INPUT type="hidden" name="X1" value="218"></DIV><DIV style="display:none;"><INPUT type="hidden" name="X579" value="1"></DIV><DIV style="display:none;"><INPUT type="hidden" name="X691" value="NTYwMjQ5MzkxNDYyNDEmNTYwMjQ5MzkxNDYyNDEmMCZYMTY4JjE0MjI1NTUxMDkmSllJR0lOVk0mYXl5JkZGRkZGRiYmMSYzJjEmdXdvb2RsZXM3Nzc2QGpvdXJyYXBpZGUuY29tJjd6c3AwJjE0MjI4MDM4NDMmJjAm"></DIV></FORM>'); 

Теперь, в самом конце, является строка, которая кодируется в Base64

NTYwMjQ5MzkxNDYyNDEmNTYwMjQ5MzkxNDYyNDEmMCZYMTY4JjE0MjI1NTUxMDkmSllJR0lOVk0mYXl5JkZGRkZGRiYmMSYzJjEmdXdvb2RsZXM3Nzc2QGpvdXJyYXBpZGUuY29tJjd6c3AwJjE0MjI4MDM4NDMmJjAm 

Но я не мог себе представить какой-либо практический способ извлечь ту самую строку каждый раз, учитывая, что первый (более длинный) строковые изменения каждый раз и могут иметь различное содержимое и длину, во всяком случае, тогда эта строка Base64 декодируется в ЭТО.

56024939146241&56024939146241&0&X168&1422555109&JYIGINVM&ayy&FFFFFF&&1&3&1&[email protected]&7zsp0&1422803843&&0& 

Теперь мы также видим эту часть декодированного строки

JYIGINVM 

Вот что мне нужно получить, следует отметить, что содержимое всех строк выше изменения каждый раз, даже в Кроме того, все изменяется, но некоторые вещи, такие как амперсанды и имена значений в первой строке. Следует также отметить, что восемь букв, которые мы хотим от третьей строки, всегда после пятого амперсанда.

Я пробовал почти слишком много раз, чтобы сделать это, основывая свой код на исследованиях из Интернета, но я не смог достичь каких-либо согласованных результатов, поэтому я пришел сюда, чтобы спросить, какой самый лучший способ предпринять задача должна быть, если возможно, и некоторыми примерами. Заранее спасибо. :)

ДРУГОЙ ПРИМЕР ПЕРВОЙ СТРИНГИ.

if (X1079) { clearTimeout (X1079); X1079 = null; } 
X781 ('<FORM name="X58" method="POST" action="http://us23.chatzy.com/31039888252154"><DIV style="display:none;"><INPUT type="hidden" name="X1" value="218"></DIV><DIV style="display:none;"><INPUT type="hidden" name="X579" value="1"></DIV><DIV style="display:none;"><INPUT type="hidden" name="X691" value="MzEwMzk4ODgyNTIxNTQmMzEwMzk4ODgyNTIxNTQmMCZYMTY4JjE0MjI1NTY0MjcmVUZWS0VPUUEmYXl5JkZGRkZGRiYmMSYzJjEmdXdvb2RsZXM3Nzc2QGpvdXJyYXBpZGUuY29tJjd6c3AwJjE0MjI4MDM4NDMmJjAm"></DIV></FORM>'); 
+0

Думаю, вам нужно определить еще несколько случаев? может быть, обнаружить шаблон среди всех из них. Это может быть единственным выходом, я думаю, не уверен, хотя регулярное выражение может помочь в этом случае. – ZdaR

+1

Вы пробовали модуль re? Это похоже на лучшее решение здесь ... –

+3

Фактическая строка, которую он выводит, начинается с этого условного выражения? Или он начинается с фактического HTML, например ''

ответ

3

Это re способ сделать это:

import re 
import base64 

data = """ 
if (X1079) { clearTimeout (X1079); X1079 = null; } 
X781 ('<FORM name="X58" method="POST" action="http://us23.chatzy.com/31039888252154"><DIV style="display:none;"><INPUT type="hidden" name="X1" value="218"></DIV><DIV style="display:none;"><INPUT type="hidden" name="X579" value="1"></DIV><DIV style="display:none;"><INPUT type="hidden" name="X691" value="MzEwMzk4ODgyNTIxNTQmMzEwMzk4ODgyNTIxNTQmMCZYMTY4JjE0MjI1NTY0MjcmVUZWS0VPUUEmYXl5JkZGRkZGRiYmMSYzJjEmdXdvb2RsZXM3Nzc2QGpvdXJyYXBpZGUuY29tJjd6c3AwJjE0MjI4MDM4NDMmJjAm"></DIV></FORM>');""" 

# Find length of characters starting with value=" and over 50 chars long 
base64str = re.search("value=\"(\w{50,})\"", data).group(1) 

# Decode 
s = base64.decodebytes(base64str.encode()).decode(errors="ignore") 

# Find section after 5th & 
out = re.search("(.+?&){5}(.+?)&", s).group(2) 

print(out) 

Альтернативой первый re.search является:

# Find the pattern name="X691" value="<base64 stuff>" 
base64str = re.search("name=\"X691\" value=\"(\w+)\"", data).group(1) 

Это могло бы работать лучше, в зависимости от того, насколько ваша длина входного изменяется ,

Вывод JYIGINVM для вашего первого примера и UFVKEOQA для вашего второго примера. Однако, в зависимости от того, насколько изменяется ваш вход, вам может потребоваться добавить больше информации.

+0

Ваша предыдущая версия была лучше (не фильтруйте по 'name', длина немного более полезна). –

+0

@OliverW. Хорошо, я думал, что версия названия может быть более надежной, но я добавлю и то, и другое. – matsjoyce

+0

Это просто превентивный подход, потому что, согласно OP, формат может меняться повсюду (сомнительно), и в этом случае атрибут 'name' не привязан к' X691' (еще раз сомнительно, скорее всего, он будет исправлен). В вашей предыдущей версии вы не делали этого предположения и просто основывали его на длине (однако даже длина может варьироваться: просто выберите «значение», и в ней тоже должны быть буквы). –

Смежные вопросы