如何使用正则表达式从复杂的动态JavaScript样式字典中提取特定值?

如何使用正则表达式从复杂的动态JavaScript样式字典中提取特定值?,javascript,python,regex,dictionary,web-scraping,Javascript,Python,Regex,Dictionary,Web Scraping,我有一个从HTML网页中检索到的扩展JS字典,我想从中提取数据,而无需解析Javascript。目前,我正在尝试使用正则表达式来实现这一点 问题是字典非常复杂且动态,这意味着,有时,我可以找到一些插入的新键,但我希望我的目标键保持不变 这是一个高度精简的数据,其中一些值被忽略,但它保持了复杂性 {"compactVideoRenderer":{"videoId":"abcDE123-_","thumbnail":{&

我有一个从HTML网页中检索到的扩展JS字典,我想从中提取数据,而无需解析Javascript。目前,我正在尝试使用正则表达式来实现这一点

问题是字典非常复杂且动态,这意味着,有时,我可以找到一些插入的新键,但我希望我的目标键保持不变

这是一个高度精简的数据,其中一些值被忽略,但它保持了复杂性

{"compactVideoRenderer":{"videoId":"abcDE123-_","thumbnail":{"thumbnails":[{"url":"OMMITED_URL","width":168,"height":94},{"url":"OMMITED_URL_TWO","width":336,"height":188}]},"title":{"accessibility":{"accessibilityData":{"label":"OMMITED_TITLE"}},"simpleText":"OMMITED_TITLE_SIMPLE"}}}
从上面,我需要提取以下值:

  • compactVideoRenderer->videoId(“abcDE123-93;”)
  • compactVideoRenderer->accessibility->simpleText(“OMMITED\u TITLE\u SIMPLE”)
解决方案必须足够灵活,如果我在任何位置插入另一个键值对(只要它不改变目标键的“地址”),正则表达式应该仍然能够找到目标值


由于Regex在编程语言方面是通用的,所以任何语言的代码都会有所帮助,然而,Python中的代码或建议都非常有用

用于从HTML字符串中提取JSON对象。然后,您就可以使用普通的Python dict了。不需要正则表达式。

当您可以以自然方式访问元素时,为什么要使用正则表达式呢

如果必须这样做,则会出现重复:

在Python3中,您可以

import json
from types import SimpleNamespace
# Parse JSON into an object with attributes corresponding to dict keys.
x = json.loads(data, object_hook=lambda d: SimpleNamespace(**d))
print(data.compactVideoRenderer.videoId)
在JS中:

const data=JSON.parse(`{
“压缩视频渲染器”:{
“videoId”:“abcDE123-u3;”,
“缩略图”:{
“缩略图”:[{
“url”:“OMMITED_url”,
“宽度”:168,
“高度”:94
}, {
“url”:“OMMITED_url_TWO”,
“宽度”:336,
“高度”:188
}]
},
“标题”:{
“无障碍”:{
“可访问数据”:{
“标签”:“OMMITED_标题”
}
},
“simpleText”:“OMMITED_TITLE_SIMPLE”
}
}
}`)
console.log(data.compactVideoRenderer.videoId)

console.log(data.compactVideoRenderer.title.simpleText)
OP需要Python我想象一下,使用Regex比用Python重建一个大字典,然后只访问几个值更轻性能和内存方面的优势。任何语言的代码都会有所帮助,但是,Python中的代码或建议会特别有用!但是看更新如果一开始它是在一个网页上,我假设它不是100.000个元素作为一个例子,页面中的一个JS脚本有30万个字符。我需要从每个请求多达100个源中检索目标值。我在一个轻型服务器上运行这个程序,用户在等待时间方面的体验非常重要。这是我不使用Selenium的主要原因之一。你可能是对的,差别可能很小,我可能不得不用你建议的方法测试性能。