Получение данных из сломанного XML в Python - PullRequest
0 голосов
/ 01 октября 2019

Я хотел бы получить данные из xml, но их структура, кажется, повреждена.

У меня есть пример URL: https://b2b.snapoutdoor.pl/rest/V1/extendvariantstocart/73478 Что такое xml с данными о продукте.

import requests
import json
from xml.etree import ElementTree
from pprint import pprint

response = requests.get(
    "https://b2b.snapoutdoor.pl/rest/V1/extendvariantstocart/86559",
    headers={"Accept": "application/xml"},
)

node = ElementTree.fromstring(response.content)

data = json.loads(node.text)

это возвращает dict с четырьмя ключами:

{'jsonChildsConfig': '{"70259":{"id":"70259","name":"Ski Ultra Merino E - '
                     'black\\/orange","sku":"610306139887","availableQty":6,"regularPrice":69.2367,"finalPrice":69.2367,"promo":false,"discount":0,"bestDiscount":false,"addToCartUrl":"https:\\/\\/b2b.snapoutdoor.pl\\/checkout\\/cart\\/add\\/uenc\\/aHR0cHM6Ly9iMmIuc25hcG91dGRvb3IucGwvcmVzdC9WMS9leHRlbmR2YXJpYW50c3RvY2FydC84NjU1OQ%2C%2C\\/product\\/86559\\/","formKey":"7OWS6VbWucoSg2zg","superAttributes":"36-39 '
                     '","salable":true},"70260":{"id":"70260","name":"Ski '
                     'Ultra Merino E - '
                     'black\\/orange","sku":"610306139894","availableQty":7,"regularPrice":69.2367,"finalPrice":69.2367,"promo":false,"discount":0,"bestDiscount":false,"addToCartUrl":"https:\\/\\/b2b.snapoutdoor.pl\\/checkout\\/cart\\/add\\/uenc\\/aHR0cHM6Ly9iMmIuc25hcG91dGRvb3IucGwvcmVzdC9WMS9leHRlbmR2YXJpYW50c3RvY2FydC84NjU1OQ%2C%2C\\/product\\/86559\\/","formKey":"7OWS6VbWucoSg2zg","superAttributes":"40-43 '
                     '","salable":true},"70261":{"id":"70261","name":"Ski '
                     'Ultra Merino E - '
                     'black\\/orange","sku":"610306139900","availableQty":6,"regularPrice":69.2367,"finalPrice":69.2367,"promo":false,"discount":0,"bestDiscount":false,"addToCartUrl":"https:\\/\\/b2b.snapoutdoor.pl\\/checkout\\/cart\\/add\\/uenc\\/aHR0cHM6Ly9iMmIuc25hcG91dGRvb3IucGwvcmVzdC9WMS9leHRlbmR2YXJpYW50c3RvY2FydC84NjU1OQ%2C%2C\\/product\\/86559\\/","formKey":"7OWS6VbWucoSg2zg","superAttributes":"44-47 '
                     '","salable":true},"99060":{"id":"99060","name":"Ski '
                     'Ultra Merino E - '
                     'black\\/orange","sku":"610306139917","availableQty":3,"regularPrice":69.24,"finalPrice":69.24,"promo":false,"discount":0,"bestDiscount":false,"addToCartUrl":"https:\\/\\/b2b.snapoutdoor.pl\\/checkout\\/cart\\/add\\/uenc\\/aHR0cHM6Ly9iMmIuc25hcG91dGRvb3IucGwvcmVzdC9WMS9leHRlbmR2YXJpYW50c3RvY2FydC84NjU1OQ%2C%2C\\/product\\/86559\\/","formKey":"7OWS6VbWucoSg2zg","superAttributes":"48+ '
                     '","salable":true}}',
 'jsonConfig': 'some data',
 'jsonDefaultPlaceholder': 'https://b2b.snapoutdoor.pl/pub/media/catalog/product/placeholder/',
 'jsonSwatchConfig': 'some data'
}

Меня интересуют значения jsonChildsConfig, но при попытке добраться до ключей внутри него я получил TypeError: string indices must be integersпотому что значение для jsonChildsConfig является строкой.

Я хотел бы получить все значения sku и stock из sku и availableQty, но их тип является строковым, и его невозможно получить через

data['jsonChildsConfig']['70259']['sku']

или

data['jsonChildsConfig']['70259']['availableQty'].

Я также пытался преобразовать эту строку в json byt json.loads(), но она не сработала.

Не могли бы вы помочьмне с этим? ??

Ответы [ 2 ]

2 голосов
/ 01 октября 2019

Чтобы исправить ваш словарь, вам нужно применить json.loads ко всем значениям вашего словаря, кроме 'jsonDefaultPlaceholder', который не в формате json:

del data['jsonDefaultPlaceholder']
new_data = {k: json.loads(v) for k, v in data.items() if v}
new_data['jsonChildsConfig']['70259']['sku']

#output: '610306139887'

или если вы хотите преобразоватьключи, которые вас интересуют в целочисленные значения:

del data['jsonDefaultPlaceholder']
new_data2 = {k: {(int(key) if key.isdigit() else key): val for key,val in json.loads(v).items()} for k, v in data.items() if v}
new_data2['jsonChildsConfig'][70259]['sku']

# output: '610306139887'
0 голосов
/ 01 октября 2019

Преобразование значения данных ['jsonChildsConfig'] в dict с использованием json.loads должно работать

>>> childConfigDetails = json.loads(data['jsonChildsConfig'])
>>> childConfigDetails['70259']['sku']
'610306139887'
...