Как извлечь JSON из HTML кода?
У меня есть вот такой HTML элемент:
<script type="application/ld+json">
{
"@context": "http://schema.org",
"BaseSalary": {
"Currency": "USD",
"Value": {
"UnitText": "YEAR",
"@type": "QuantitativeValue"
},
"@type": "MonetaryAmount"
},
"DatePosted": "2020-05-15T05:04:20.193",
"EducationRequirements": "",
"EmploymentType": [
"FULL_TIME"
],
"ExperienceRequirements": "",
"Identifier": "927323",
"HiringOrganization": {
"Name": "Staples Stores",
"@type": "Organization"
},
"JobLocation": {
"Address": {
"AddressLocality": "Elgin",
"AddressRegion": "IL",
"AddressCountry": "US",
"PostalCode": "60123",
"@type": "PostalAddress"
},
"Geo": {
"Latitude": 42.03891,
"Longitude": -88.31189,
"@type": "GeoCoordinates"
},
"@type": "Place"
},
"Title": "Xerox Certified iGen Operator",
"@type": "JobPosting"
}
</script>
Надо текст, заключенный в тег <script>, извлечь в виде JSON, чтобы удобнее было с ним работать.
Ответы (2 шт):
Автор решения: Qwertiy
→ Ссылка
import re
import html
import json
s= """j kj klajkldj lkdjslak jk
<script type="application/ld+json">
{
"@context": "..."
}
</script>
ds ad sad ksalkd l;ask;l"""
print(
json.loads(
html.unescape(
re.search(
r"""<script\s+type\s*=\s*(["']?)application/ld\+json\1\s*>((?:(?!</script>)[\s\S])+)</script>""",
s
).group(2)
)
)
)
Автор решения: insolor
→ Ссылка
Можно обработать html с помощью lxml:
# Сократил html из вопроса, чтобы не занимать лишнее место в ответе
text = '''
<script type="application/ld+json">
{
"@context": "http://s...content-available-to-author-only...a.org"
}
</script>
'''
import json
import html
import lxml.html
data = lxml.html.fromstring(text)
print(json.loads(
html.unescape(
data.xpath('//script[@type="application/ld+json"]/text()')[0])))
Вывод:
{'@context': 'http://s...content-available-to-author-only...a.org'}