BeautifulSoup и запись в файл JSON - PullRequest
0 голосов
/ 24 апреля 2018

Я собираю в Интернете некоторые данные с помощью BeautifulSoup и хочу записать эти данные в файл json. Мне удалось написать сценарий для сохранения данных в файл JSON, но он сохраняет только последний элемент на странице и не просматривает весь результат. Он распечатывает каждый результат в терминале. Я не уверен, что мне не хватает. Вот мой код

from urllib.request import urlopen
from bs4 import BeautifulSoup as soup
import json

otl_url = 'https://open.umn.edu/opentextbooks/SearchResults.aspx?subjectAreaId=99'

#opening up connection and grabbing page
uClient = urlopen(otl_url)
page_html = uClient.read()
uClient.close()

#html parsing
page_soup = soup(page_html, "html.parser")

#grabs info for each textbook
containers = page_soup.findAll("div",{"class":"twothird"})

data = {}
for container in containers:
   data['title'] = container.h2.text 
   data['author'] = container.p.text
   data['link'] = "https://open.umn.edu/opentextbooks/" + container.h2.a["href"]

   print("title: " + data['title'])
   print("author: " + data['author'])
   print("link: " + data['link'])

with open("textbooks.json", "w") as writeJSON:
   json.dump(data, writeJSON, ensure_ascii=False)

Ответы [ 3 ]

0 голосов
/ 24 апреля 2018

В вашем цикле for эти строки:

data['title'] = container.h2.text 
data['author'] = container.p.text
data['link'] = "https://open.umn.edu/opentextbooks/" + container.h2.a["href"]

сбрасывают значение словаря на каждой итерации цикла.То, что я бы посоветовал вам сделать, это сделать их список следующим образом:

data['title'] = []
data['author'] = []
data['link'] = []

, а затем в вашем цикле for есть

data["title"].append(container.h2.text)
data["author"].append(container.p.text)
data["link"].append("https://open.umn.edu/opentextbooks/" + container.h2.a["href"])

, который сохранит все найденные контейнеры,и вы должны увидеть все в вашем файле JSON.

Надеюсь, это поможет!

0 голосов
/ 24 апреля 2018

Это потому, что вы переназначаете объект data на каждой итерации цикла.Вы, вероятно, хотите что-то вроде этого:

data = [] # create a list to store the items
for container in containers:
    item = {}
    item['title'] = container.h2.text
    item['author'] = container.p.text
    item['link'] = "https://open.umn.edu/opentextbooks/" + container.h2.a["href"]
    data.append(item) # add the item to the list

    print("title: " + item['title'])
    print("author: " + item['author'])
    print("link: " + item['link'])

with open("textbooks.json", "w") as writeJSON:
    json.dump(items, writeJSON, ensure_ascii=False)
0 голосов
/ 24 апреля 2018

Вы храните свои данные в dict, и они могут содержать только один ключ с тем же именем.Вам нужно будет использовать список, если вы хотите сохранить несколько, например:

data = []
for container in containers:
   data.append({"title": container.h2.text, "author": container.p.text,
                "link": "https://open.umn.edu/opentextbooks/" + container.h2.a["href"]})

with open("textbooks.json", "w") as writeJSON:
   json.dump(data, writeJSON, ensure_ascii=False)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...