Метод 1
Возможно,
\bvar\s+images\s*=\s*(\[[^\]]*\])
может работать до некоторой степени:
Тест
import re
from bs4 import BeautifulSoup
# Example of a HTML source code containing `images` array
html = '''
<html>
<head>
<script type="text/javascript">
$(document).ready(function(){
var images = [
{
src: "http://example.com/bar/001.jpg",
title: "FooBar One"
},
{
src: "http://example.com/bar/002.jpg",
title: "FooBar Two"
},
]
;
var other_data = [{"name": "Tom", "type": "cat"}, {"name": "Jerry", "type": "dog"}];
</script>
<body>
<p>Some content</p>
</body>
</head>
</html>
'''
soup = BeautifulSoup(html, 'html.parser')
scripts = soup.find_all('script') # successfully captures the <script> element
for script in scripts:
data = re.findall(
r'\bvar\s+images\s*=\s*(\[[^\]]*\])', script.string, re.DOTALL)
print(data[0])
Вывод
[{
src: "http://example.com/bar/001.jpg",
title:" FooBar One "},
{
src:" http://example.com/bar/002.jpg",
title: "FooBar Two"},
]
Если вы хотите упростить / изменить / изучить выражение, это было объяснено на верхней правой панели regex101.com . При желании вы также можете посмотреть в эту ссылку , как она будет сопоставляться с некоторыми примерами ввода.
Метод 2
Другой вариант будет:
import re
string = '''
<html>
<head>
<script type="text/javascript">
$(document).ready(function(){
var images = [
{
src: "http://example.com/bar/001.jpg",
title: "FooBar One"
},
{
src: "http://example.com/bar/002.jpg",
title: "FooBar Two"
},
]
;
var other_data = [{"name": "Tom", "type": "cat"}, {"name": "Jerry", "type": "dog"}];
</script>
<body>
<p>Some content</p>
</body>
</head>
</html>
'''
expression = r'src:\s*"([^"]*)"\s*,\s*title:\s*"([^"]*)"'
matches = re.findall(expression, string, re.DOTALL)
output = []
for match in matches:
output.append(dict({"src": match[0], "title": match[1]}))
print(output)
Выход
[{'src': 'http://example.com/bar/001.jpg', 'title': 'FooBar One'}, {'src': 'http://example.com/bar/002.jpg', 'title': 'FooBar Two'}]