Ваша проблема в том, что в извлеченном словаре Javascript: у вас есть объекты.
{
page: {
pageInfo: {
destinationURL: window.location.href,
error: '',
language: 'en',
country: 'US',
pageName: 'tangelo2',
articlepubdate: '',
articleenddate: '',
pageTitle: 'HealthServicesInnovationCompany',
pageOwner: '',
pageTemplate: '',
pageCampaign: '',
tags: '',
pageLastPublishDate: '2020-01-08T12:15:04.032-06:00',
pageLastPublishedBy: 'admin',
pageLastModifiedDate: '2020-01-08T10:24:36.466-06:00',
pageLastModifiedBy: 'katrina'
},
recEngine: {
title: 'Home',
image: '',
description: ''
},
category: {
siteName: window.location.hostname.replace("www.", ""),
version: '3.0',
contentType: '',
contentTopic: '',
contentSegment: '',
contentInitiative: '',
contentProduct: '',
contentProductLine: '',
primaryCategory: 'tangelo2'
}
},
event: {}
}
Обратите внимание на значения page.pageInfo.destinationURL
и page.category.siteName
.
В данном случае ast.literal_eval
или любой другой метод, который вы можете попытаться преобразовать в этот словарь Javascript в Python, приведет к ошибке. Вам нужно будет найти способ удалить window...
из my_dict['digitalData']
перед обработкой его с помощью ast
, demjson
или любым другим инструментом.
Возможное решение, подобное этому, использует demjson
вместо ast
.
import scrapy
import pprint
import demjson
import re
class OptumSpider(scrapy.Spider):
name = 'optum'
allowed_domains = ['optum.com']
start_urls = ['http://optum.com/']
def parse(self, response):
#Step 1: remove all spaces, new lines and tabs
string = (re.sub('[\s+;]','',response.xpath('//script/text()')[2].extract()))
# Step 2: convert string to dictionary. Creates a key as "digitalData"
js_dict = string.split("=")[1]
js_dict = re.sub(r"\bwindow(.*?),\b", '"",', js_dict)
# Step 3: extract dictionary
my_dict = demjson.decode(js_dict)
pprint.pprint(my_dict)
print(type(my_dict))
При работе
scrapy runspider test.py -s LOG_ENABLED=False
Это выводит:
{'event': {},
'page': {'category': {'contentInitiative': '',
'contentProduct': '',
'contentProductLine': '',
'contentSegment': '',
'contentTopic': '',
'contentType': '',
'primaryCategory': 'tangelo2',
'siteName': '',
'version': '3.0'},
'pageInfo': {'articleenddate': '',
'articlepubdate': '',
'country': 'US',
'destinationURL': '',
'error': '',
'language': 'en',
'pageCampaign': '',
'pageLastModifiedBy': 'katrina',
'pageLastModifiedDate': '2020-01-08T10:24:36.466-06:00',
'pageLastPublishDate': '2020-01-08T12:15:04.032-06:00',
'pageLastPublishedBy': 'admin',
'pageName': 'tangelo2',
'pageOwner': '',
'pageTemplate': '',
'pageTitle': 'HealthServicesInnovationCompany',
'tags': ''},
'recEngine': {'description': '', 'image': '', 'title': 'Home'}}}
<class 'dict'>