簡體   English   中英

Python:在HTML文件中解碼base64編碼的字符串,並將其替換為已解碼的字符串

[英]Python: Decoding base64 encoded strings within an HTML file and replacing these strings with their decoded counterpart

請幫忙,因為這個翻轉程序是我持續的噩夢!

我有幾個文件,其中包含一些base64編碼的字符串。 例如,一個文件的一部分內容如下:

charset=utf-8;base64,I2JhY2tydW5uZXJfUV81c3R7aGVpZ2h0OjkzcHg7fWJhY2tydW5uZXJfUV81c3R7ZGlzcGxheTpibG9jayFpbXBvcnRhbnQ7fQ==" 

它們始終采用“ ANYTHINGbase64,STRING”格式。它是html,但我將其視為一個大字符串,並在其他地方使用BeautifulSoup。 我使用正則表達式'base'提取base64字符串,然后使用base64模塊根據我定義的函數“ debase”對此進行解碼。

這似乎可以正常工作:由於某種原因,b64encode的輸出會添加不必要的內容:

b'#backrunner_Q_5st {height:93px;} backrunner_Q_5st {display:block!important;}',中間是字符串。

我猜這意味着以字節為單位; 所以我試圖讓我的函數將其編碼為utf8,但基本上我已經超出了深度。

我想要的最終結果是將我html中的所有“ base64,STRING”解碼並替換為DECODEDSTRING。

請幫忙!

import os, sys, bs4, re, base64, codecs
from bs4 import BeautifulSoup

def debase(instr):
    outstring = base64.b64decode(instr)
    outstring = codecs.utf_8_encode(str(outstring))
    outstring.split("'")[1]
    return outstring

base = re.compile('base64,(.*?)"')

for eachArg in sys.argv[1:]:
    a=open(eachArg,'r',encoding='utf8')
    presoup = a.read()
    b = re.findall(base, presoup)
    for value in b:
        re.sub('base64,.*?"', debase(value))
        print(debase(value))


    soup=BeautifulSoup(presoup, 'lxml')
    bname= str(eachArg).split('.')[0]
    a.close()
    [s.extract() for s in soup('script')]
    os.remove(eachArg)
    b=open(bname +'.html','w',encoding='utf8')
    b.write(soup.prettify())
    b.close()

您的輸入格式有些奇怪(例如,尾隨不匹配的單引號),因此請確保您沒有做不必要的工作或以怪異的方式解析內容。

無論如何,假設您具有輸入形式的輸入,則必須以剛才的方式使用base64對其進行解碼,然后使用給定的編碼進行解碼以獲取字符串而不是字節字符串:

import base64

inp = 'charset=utf-8;base64,I2JhY2tydW5uZXJfUV81c3R7aGVpZ2h0OjkzcHg7fWJhY2tydW5uZXJfUV81c3R7ZGlzcGxheTpibG9jayFpbXBvcnRhbnQ7fQ=="'
head,tail = inp.split(';')
_,enc = head.split('=') # TODO: check if the beginning is "charset"
_,msg = tail.split(',') # TODO: check that the beginning is "base64"

plaintext_bytes = base64.b64decode(msg)
plaintext_str = plaintext_bytes.decode(enc)

現在兩個結果是

>>> plaintext_bytes
b'#backrunner_Q_5st{height:93px;}backrunner_Q_5st{display:block!important;}'
>>> plaintext_str
'#backrunner_Q_5st{height:93px;}backrunner_Q_5st{display:block!important;}'

如您所見,字節的內容已經可讀,這是因為內容是ASCII。 還要注意,我沒有從字符串中刪除尾隨引號: base64足夠聰明,可以忽略內容中兩個等式符號之后的內容。


簡而言之,字符串是python 3中某種程度上抽象的文本表示形式,如果要用一和零的流來表示文本,則需要特定的編碼(將數據從一個位置傳輸到另一個位置時需要用到) 。 當您獲得一個以字節為單位的字符串時,您必須知道它是如何編碼的才能對其進行解碼並獲得正確的字符串。 如果字符串是ASCII兼容的,則編碼是相當瑣碎的,但是如果您使用錯誤的編碼,則再次出現一般字符時,您的代碼將中斷。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM