我正在使用 requests 和 BeautifulSoup4 从网页下载和抓取信息,我成功地将其范围缩小到我试图从中获取数据的特定 <script> 标签内的所有内容。为了让这部分代码正常工作,我跳过了所有请求和 BS4 内容,只是在代码开头添加了这个字符串,如下所示:
Content = '''// <![CDATA[
devicetype = "computer";
isios = false;
videocdn = "media";
videopath = "updates/na/vid01";
poster = {
"file": "preview/vidsplash.jpg",
"st": "1557499029",
"et": "1557502629",
"hs": "f3ad16f42fec5224d323915cdfbf43ed"
};
attachname = "some-video-00001234";
videos[0] = {
"wmv": {
"file": "wmv/01.wmv",
"name": "01",
"duration": 502,
"size": "195.1MB",
"wid": 854,
"hgt": 480,
"st": "1557499029",
"et": "1557502629",
"hs": "a0cfdef3b8b9e3dea576368a5bfbaef9",
"caps": []
},
"h264": {
"file": "h264/01.mp4",
"name": "01",
"duration": 502,
"size": "73.9MB",
"wid": 854,
"hgt": 480,
"st": "1557499029",
"et": "1557502629",
"hs": "32901a1870d0b32458b465ac9c3d6cad",
"caps": [{
"file": "001.jpg",
"fs": {
"st": "1557499029",
"et": "1557502629",
"hs": "5b328642a84fa6406bda527c18e46c27"
},
"tn": {
"st": "1557499029",
"et": "1557502629",
"hs": "0a4ad7d0edf1b92538b8127f8e297c41"
}
}, {
"file": "002.jpg",
"fs": {
"st": "1557499029",
"et": "1557502629",
"hs": "4390c0d9b321b5e86c88cb8ca5e56ede"
},
"tn": {
"st": "1557499029",
"et": "1557502629",
"hs": "9cf83158268379df660d6d01750a047c"
}
}]
}
};
// ]]>'''
另请注意,这是经过美化的。通常,“poster”和“videos[0]”变量各自位于自己的行中,而不是多行并且像这样缩进。这不是 <script> 标签中的完整数据集,我只是删除了重复的部分,以便大家能够了解数据的结构。另请注意,“videos[0]”会将类似的数据结构重复到“videos[1]”中,依此类推,次数可变。
我想做的是以某种方式将大的多行字符串转换成一个合适的字典,我可以在我的Python代码中操作它来提取我需要的位
打印(新内容)
输出:
{'devicetype' = '计算机', 'isios' = False, "videocdn"= "媒体"}
等等。
我一直在摆弄 js2py 试图让它做我需要它做的事情,但到目前为止我得到的最远的是这段代码:
splitrawlines = CONTENT.splitlines()
rawvars = []
for line in splitrawlines:
# need to add the videos declaration in case it gets to a line where it expects it to already be declared.
rawvars.append(js2py.eval_js("videos = [];\n" + line))
print(rawvars)
唯一的问题是它不会将其输出为字典,而是将其输出为列表,我仍然可以使其工作,但它甚至不是 python 可以操作的列表,从技术上讲它仍然是一个 js2py.base.JsObjectWrapper
对象。我可以将该对象转换为字符串,但我能找到的将字符串转换为列表的唯一方法是用空格分隔字符串中的所有内容,并将每个分隔的部分放入列表中自己的条目中。我基本上有一个已经格式化的列表,就在一个字符串内。
我可能会用该代码走错误的方向,但这是迄今为止我得到的最接近的方向。因此,我需要找到一种方法将基本上已经格式化为完整列表的字符串转换为实际的列表对象,或者更佳的是,找到某种不同的方法将随机 JavaScript 代码中的所有变量转换为我所使用的 native python 变量。可以操纵。
最佳答案
JavaScript 数据大多是 JSON 格式,因此您可以使用 python 模块 json
将其转换为 python字典
。
作为 "videos[0] = "
创建正确的 JSON 数据后的示例数据,您可以使用 data = json.loads(stringg)
创建字典 - 然后你可以得到即。 数据['wmv']['大小']
data = '''{
"wmv": {
"file": "wmv/01.wmv",
"name": "01",
"duration": 502,
"size": "195.1MB",
"wid": 854,
"hgt": 480,
"st": "1557499029",
"et": "1557502629",
"hs": "a0cfdef3b8b9e3dea576368a5bfbaef9",
"caps": []
},
"h264": {
"file": "h264/01.mp4",
"name": "01",
"duration": 502,
"size": "73.9MB",
"wid": 854,
"hgt": 480,
"st": "1557499029",
"et": "1557502629",
"hs": "32901a1870d0b32458b465ac9c3d6cad",
"caps": [{
"file": "001.jpg",
"fs": {
"st": "1557499029",
"et": "1557502629",
"hs": "5b328642a84fa6406bda527c18e46c27"
},
"tn": {
"st": "1557499029",
"et": "1557502629",
"hs": "0a4ad7d0edf1b92538b8127f8e297c41"
}
}, {
"file": "002.jpg",
"fs": {
"st": "1557499029",
"et": "1557502629",
"hs": "4390c0d9b321b5e86c88cb8ca5e56ede"
},
"tn": {
"st": "1557499029",
"et": "1557502629",
"hs": "9cf83158268379df660d6d01750a047c"
}
}]
}
}'''
import json
data = json.loads(data)
print(data['wmv']['size'])
# 195.1MB
如果每个变量都是一行,那么您可以使用 split('\n')
获取行,然后使用 split('=')
获取 key 和值(value)。
然后您只需检查值是否以 {
或 [
开头即可使用 json
。其他值可以是普通字符串,因此不需要 json
- 它可能只需要删除 "
。
Content = '''// <![CDATA[
devicetype = "computer";
isios = false;
videocdn = "media";
videopath = "updates/na/vid01";
poster = {"file": "preview/vidsplash.jpg","st": "1557499029","et": "1557502629","hs": "f3ad16f42fec5224d323915cdfbf43ed"};
attachname = "some-video-00001234";'''
import json
results = {}
for line in Content.split('\n'):
if ' = ' in line:
line = line[:-1] # remove `;`
key, val = line.split(' = ', 1)
if val.startswith( ('[', '{') ):
results[key] = json.loads(val)
elif val.startswith('"'):
val = val[1:-1] # remove `"`
results[key] = val
elif val == 'false':
results[key] = False
elif val == 'true':
results[key] = True
print(results['devicetype'])
print(results['isios'])
print(results['videocdn'])
print(results['poster']['file'])
# computer
# False
# media
# preview/vidsplash.jpg
关于javascript - Python3将一堆javascript变量从网页抓取到python dict对象中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56087295/