2013-03-20 4 views
1

Может ли кто-нибудь продемонстрировать, как вы можете base64 декодировать конкретный раздел строки, используя поиск в регулярном выражении? Я хотел бы, чтобы конечный результат возвращал всю строку, но с базовыми областями, декодированными.Base64 декодирует секцию строки с использованием модулей re и base64

Текст между тегами категории и тегами подкатегорий должен быть декодирован, а затем должен быть возвращен весь strinf.

<attack_headline><site_id>1</site_id><category>U1FMIEluamVjdGlvbg==</category><subcategory>Q2xhc3NpYyBTUUwgQ29tbWVudCAmcXVvdDstLSZxdW90Ow==</subcategory><client_ip>192.168.1.102</client_ip><date>1363807248</date><gmt_diff>0</gmt_diff><reference_id>E711-3EFB-5F43-5FAC</reference_id></attack_headline> 
+0

что у вас до сих пор? – MattDMo

+0

вам не следует применять регулярное выражение для XML или HTML. Это просто просит неприятностей. Разберите XML и HTML, расшифруйте соответствующий атрибут/текст тега, затем снова распечатайте XML/HTML. – isedev

+0

Мэтт для этой конкретной цели ... ничего. Я просто искал 1 - 2 лайнер, где кто-то хранит строку в переменной (с которой я бы все равно имел дело), ​​а затем просто используйте regex() и, возможно, base64.b64decode(), чтобы исправить строку. –

ответ

1

Основываясь на мой комментарий, вот пример использования lxml.etree, который принимает ваш вклад XML (если HTML, используйте lxml.html вместо этого):

>>> import base64 
>>> import lxml.etree 
>>> text = "<attack_headline><site_id>1</site_id><category>U1FMIEluamVjdGlvbg==</category><subcategory>Q2xhc3NpYyBTUUwgQ29tbWVudCAmcXVvdDstLSZxdW90Ow==</subcategory><client_ip>192.168.1.102</client_ip><date>1363807248</date><gmt_diff>0</gmt_diff><reference_id>E711-3EFB-5F43-5FAC</reference_id></attack_headline>" 
>>> xml = lxml.etree.fromstring(text) 
>>> for tag_with_base64 in ('category','subcategory'): 
...  node = xml.find(tag_with_base64) 
...  if node: 
...   node.text = base64.b64decode(node.text) 
>>> lxml.etree.tostring(xml) 
'<attack_headline><site_id>1</site_id><category>SQL Injection</category><subcategory>Classic SQL Comment &amp;quot;--&amp;quot;</subcategory><client_ip>192.168.1.102</client_ip><date>1363807248</date><gmt_diff>0</gmt_diff><reference_id>E711-3EFB-5F43-5FAC</reference_id></attack_headline>' 
+0

isdev ... Ты рок ... Спасибо, чувак. –

+0

Вопрос: Может ли xml.find() принять несколько значений. Так как мне нужно искать два разных тега –

+0

Я хочу декодировать любую строку, которая закодирована base64 в строке, а затем возвращает полную строку. Вы сделали это в своем примере, за исключением того, что вы пропустили строку внутри

0
events = client.service.get_recent_attacks("",epoch_time_last,epoch_time_now,1,"",15) 
text = re.sub('(?<!<\/attack_headline>)\s*\n\s*', '', events) 
xml = lxml.etree.fromstring(text) 
for tag_with_base64 in ('category','subcategory'): 
    node = xml.find(tag_with_base64) 
    node.text = base64.b64decode(node.text) 
lxml.etree.tostring(xml) 
+0

raceback (самый последний вызов последнего): Файл "dDAPI-NTLM_demo.py", строка 16, в основной() Файл "dDAPI-NTLM_demo.py", строка 12, в основных cl.get_recent_attacks (клиент) Файл «/root/helpers.py», строка 66, в get_recent_attacks node.text = base64.b64decode (node.text) AttributeError: объект «NoneType» не имеет атрибута «текст» –

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