Вывод данных в выходной файл с помощью python json.dump (Array, outfile) - PullRequest
0 голосов
/ 16 октября 2019

Я пытаюсь записать данные, которые я "скопировал" с сайта, в выходной файл json со следующим кодом:

from bs4 import BeautifulSoup
import requests
import json

path = ["https://www.test.be?page=,https://www.test2.be?page="]

adresArr = []
for i in path:
    pagina = 0;
    for x in range(0, 4):
        url = i + str(pagina)
        response = requests.get(url, timeout=5)
        content = BeautifulSoup(response.content, "html.parser")
        for adres in content.findAll('tr', attrs={"class": "odd clickable-row"}):
            adresObject = {
                "postcode": adres.find('td', attrs={"class": "views-field views-field-field-locatie-postal-code"}).text.encode('utf-8'),
                "naam": adres.find('td', attrs={"class": "views-field views-field-field-locatie-thoroughfare"}).text.encode('utf-8'),
                "plaats": adres.find('td', attrs={"class": "views-field views-field-field-locatie-locality"}).text.encode('utf-8')
            }
            adresArr.append(adresObject)


        for adres in content.findAll('tr', attrs={"class": "odd clickable-row active"}):
            adresObject = {
                "postcode": adres.find('td', attrs={"class": "views-field views-field-field-locatie-postal-code"}).text.encode('utf-8'),
                "naam": adres.find('td', attrs={"class": "views-field views-field-field-locatie-thoroughfare"}).text.encode('utf-8'),
                "plaats": adres.find('td', attrs={"class": "views-field views-field-field-locatie-locality"}).text.encode('utf-8')
            }
            adresArr.append(adresObject)

            pagina = x

    with open('adresData.json', 'w') as outfile:
         json.dump(adresArr, outfile)

Я получаю следующее ошибка : объект типа байтов не json сериализуемый

Если я распечатаю сам массив, он выглядит хорошо. Но я застрял при записи его в файл JSON. Что я делаю не так?

Это мой первый раз кодирование на python (и не так уж много опыта кодирования). Поэтому, пожалуйста, сделайте ваш ответ понятным для понимания :)

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 16 октября 2019

Чтобы решить эту проблему ... Вам просто нужно преобразовать тип данных вашего элемента, вот ссылка на ранее отвеченный тот же вопрос

TypeError: Объект типа 'bytes' не являетсяСерийный JSON

это может помочь

0 голосов
/ 16 октября 2019

В таких строках:

"postcode": adres.find('td', attrs={"class": "views-field views-field-field-locatie-postal-code"}).text.encode('utf-8')

Результат .text уже должен быть строкой;.encode('utf-8') делает его объектом bytes, на который жалуется библиотека json. Так что просто оставьте это: adres.find('td', attrs={"class": "views-field views-field-field-locatie-postal-code"}).text.

Справочная информация: байты - это необработанные единицы информации;Строки - это то, как мы представляем текст. Мы en кодируем строку, чтобы сделать байты, используемые для хранения;мы де кодируем байты, чтобы получить строку обратно. Но JSON уже предназначен для работы со строками - библиотека будет обрабатывать кодировку файла для вас, когда она действительно записывает на диск.

...