繁体   English   中英

BeautifulSoup并写入JSON文件

[英]BeautifulSoup and writing to JSON file

我正在网上使用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)

您将数据存储在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)

在您的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文件中看到所有内容。

希望这可以帮助!

这是因为您要在循环的每次迭代中重新分配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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM