Есть ли способ преобразовать список словаря в формате строки в кадр данных в Python? - PullRequest
0 голосов
/ 14 февраля 2020

Я тренируюсь, как использовать beautifulsoup и в настоящее время в рассоле, так как я не могу преобразовать результаты в фрейм данных. Надеюсь получить вашу помощь.

В этом примере страницу, которую я хочу почистить, можно получить с помощью следующего:

from bs4 import BeautifulSoup
import requests
import pandas as pd

page = requests.get("https://store.moncler.com/en-ca/women/autumn-winter/view-all-outerwear?tp=72010&ds_rl=1243188&gclid=EAIaIQobChMIpfDj9bjP5wIVlJOzCh0-9ghJEAAYASAAEgLuSfD_BwE&gclsrc=aw.ds", verify = False)
soup = BeautifulSoup(page.content, 'html.parser')

Мне удалось изолировать раздел продукта с помощью следующего code

test_class = []

for section_tag in soup.find_all('section', class_='search__products__shelf search__products__shelf--moncler'):
    for test in section_tag.find_all('article'):
        test_class.append(test.get('data-ytos-track-product-data'))

Результатом этого является список строкового словаря в формате строки, который выглядит следующим образом:

['{"product_position": 0, "PRODUCT_TITLE": "Treport", "product_brand": "MONCLER", "PRODUCT_CATEGORY": "3074457345616676837/3074457345616676843", "product_micro_category": "Верхняя одежда", "product_micro_category_id": "3074457345616676843", "product_macro_category": "OUTERWEAR "," product_macro_category_id ":" 3074457345616676837 "," product_color_id ":" Темно-синий "," product_color ":" Темно-синий "," product_price ": 0.0," product_discountsPrice ": 2530.0," product_price_tf ":" 0 "," product_disc ":" 2126,05" , "product_id": "1890828705323513", "product_variant_id": "1890828705323514", "список": "SearchResult", "product_quantity": 1, "product_coupon": "", "product_cod8": нулевой,» product_c od10 ": null," product_legacy_macro_id ":" 1012 "," product_legacy_micro_id ":" 1446 "," product_is_in_stock ": true," is_rsi_product ": false," rsi_product_tracking_url ":" "}", "{" product_position «product_title»: «RIMA C», «product_brand»: «MONCLER», «product_category»: «3074457345616676837/3074457345616676854», «product_micro_category»: «Bomber Jacket», «product_micro_category_6845» 66: 306): «: "OUTERWEAR", "product_macro_category_id": "3074457345616676837", "product_color_id": "Темно-синий", "product_color": "Темно-синий", "product_price": 0.0, "product_discountingPrice": 2340.0, "product_price_tf": "0" "product_discountedPrice_tf": "1966,39", "product_id": "5549023491788128", "product_variant_id": "5549023491788129", "список": "SearchResult", "product_quantity": 1, "product_coupon": "", "product_cod8": нулевая , "product_cod10": null, "product_legacy_macro_id": "1012", "product_legacy_micro_id": "4715", "product_is_in_stock": true, "is_rsi_product": false, "rsi_product_tracking_url *url": ""} '1014: 1014, 1015

My qu Вопрос в том, как преобразовать результат в pandas фрейм данных из списка словаря со строковым форматом , например, такого?

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

import ast
ast.literal_eval(test_class[1])

но безрезультатно (ниже приведен код ошибки).

ValueError: неправильно сформированный узел или строка: <_ast.Name объект в 0x000001985A976748>

Конечный результат должен хранить каждый ключ словаря в столбцах в кадре данных (ie. 'product_position', 'product_title', 'product_brand', et c)

Любая помощь / руководство будет высоко ценится.

Спасибо.

Ответы [ 2 ]

1 голос
/ 14 февраля 2020

Похоже, вопрос на самом деле в том, как разобрать строку, а не в том, как что-то сделать с pandas.

Список, который у вас, похоже, содержит просто допустимые json строки. Вы можете преобразовать их в python dict, используя json.loads() из стандартной библиотеки lib. Конечно, если некоторые строки искажены, это уже другая история, вам придется поискать, как разбирать искаженные jsons.

После получения списка python диктов их преобразование в DataFrame становится тривиальным.

0 голосов
/ 15 февраля 2020

вы можете использовать json.loads, а затем создать экземпляр pandas.DataFrame с полученным списком словарей:

d = [json.loads(e) for e in data]
df = pd.DataFrame(d)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...