Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:解码HTML文件中的base64编码字符串,并用解码后的字符串替换这些字符串_Python_Html_Beautifulsoup_Base64_Decoding - Fatal编程技术网

Python:解码HTML文件中的base64编码字符串,并用解码后的字符串替换这些字符串

Python:解码HTML文件中的base64编码字符串,并用解码后的字符串替换这些字符串,python,html,beautifulsoup,base64,decoding,Python,Html,Beautifulsoup,Base64,Decoding,请帮助我,因为这个翻页程序是我的噩梦 我有几个文件,其中包括一些base64编码的字符串。 示例文件的一部分内容如下: charset=utf-8;base64,I2JhY2tydW5uZXJfUV81c3R7aGVpZ2h0OjkzcHg7fWJhY2tydW5uZXJfUV81c3R7ZGlzcGxheTpibG9jayFpbXBvcnRhbnQ7fQ==" 它们的格式始终为“ANYTHINGbase64,STRING” 它是html,但我将其视为一个大字符串,并在其他地方使用Beaut

请帮助我,因为这个翻页程序是我的噩梦

我有几个文件,其中包括一些base64编码的字符串。 示例文件的一部分内容如下:

charset=utf-8;base64,I2JhY2tydW5uZXJfUV81c3R7aGVpZ2h0OjkzcHg7fWJhY2tydW5uZXJfUV81c3R7ZGlzcGxheTpibG9jayFpbXBvcnRhbnQ7fQ==" 
它们的格式始终为“ANYTHINGbase64,STRING” 它是html,但我将其视为一个大字符串,并在其他地方使用BeautifulSoup。我使用正则表达式“base”提取base64字符串,然后使用base64模块根据我定义的函数“debase”对其进行解码

这似乎在某种程度上是正常的:出于某种原因,b64encode的输出添加了不必要的内容:

b′.RunRunnEnqQ5St{{高度:93px;} RunRunnLyqQ5St{显示:块!重要;}用字符串中的东西。

我猜这意味着以字节为单位;所以我试着让我的函数将其编码为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对其进行解码,然后使用给定的编码进行解码,以获得字符串,而不是bytestring:

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
足够聪明,可以忽略内容中两个等式符号之后的内容



简而言之,字符串在Python3中是文本的一种抽象表示形式,如果您想用一个1和0的流来表示文本(当您将数据从一个地方传输到另一个地方时需要使用该流),则需要特定的编码。当你得到一个以字节为单位的字符串时,你必须知道它是如何编码的,以便对它进行解码并获得一个合适的字符串。如果字符串是ASCII兼容的,那么编码就相当简单,但是一旦出现更多的通用字符,如果使用错误的编码,代码就会中断。

您的输入格式有点奇怪(例如,后面有一个不匹配的单引号),因此请确保您没有做不必要的工作或以奇怪的方式解析内容

无论如何,假设输入的格式是给定的,则必须按照刚才的方式使用base64对其进行解码,然后使用给定的编码进行解码,以获得字符串,而不是bytestring:

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
足够聪明,可以忽略内容中两个等式符号之后的内容



简而言之,字符串在Python3中是文本的一种抽象表示形式,如果您想用一个1和0的流来表示文本(当您将数据从一个地方传输到另一个地方时需要使用该流),则需要特定的编码。当你得到一个以字节为单位的字符串时,你必须知道它是如何编码的,以便对它进行解码并获得一个合适的字符串。如果字符串是ASCII兼容的,那么编码是相当微不足道的,但是一旦出现更多的通用字符,如果使用错误的编码,您的代码将中断。字符集告诉您编码是utf8,如果使用
utf8
对这些字节进行解码,您将得到“相同”的结果:都是ASCII码。所以问题是为什么这些字符会出现在base64编码字符串中。根据您的输出,我认为您的解码尝试是正确的。抱歉,我不明白的是,我正在尝试删除一个额外的b''和撇号,以便能够以纯文本形式交换它。但是输出似乎是二进制或字节数据,中间的字符在BASE64编码的字符串中确实存在;字符集告诉您编码是utf8,如果使用
utf8
对这些字节进行解码,您将得到“相同”的结果:都是ASCII码。所以问题是为什么这些字符会出现在base64编码字符串中。根据您的输出,我认为您的解码尝试是正确的。抱歉,我不明白的是,我正在尝试删除一个额外的b''和撇号,以便能够以纯文本形式交换它。但输出似乎是二进制或字节数据快速问:为什么有单尾随引号,我用它来描绘正则表达式的边界:有没有一种方法可以让正则表达式停止,而不知道第一个非base64编码字符在哪里?@lgjmac末尾的两个等式符号表示base64字符串的填充端。始终可以在正则表达式中显式地将要匹配的字符作为base64字符串的一部分;但老实说,我怀疑使用beautifulsoup本身来提取所需信息(即标记/字段/任何包含base64字符串的内容,而不必使用正则表达式)应该很简单,毕竟它是一个html解析器库。如果您不能这样做,您可以编写一个只匹配base64使用的64个字符的讨厌的正则表达式。我想试试后一种。快速问:为什么后面有一个单引号,我用它来描绘正则表达式的边界:有没有一种方法可以让正则表达式停止,而不知道第一个非base64编码字符在哪里?@lgjmac末尾的两个等式符号表示base64字符串的填充端。作为bas的一部分,始终可以显式包含要匹配的字符