我正在运行一个脚本,以寻找教科书信息的网站,我有脚本工作。但是,当它写入JSON文件时,它会给我重复的结果。我正试图找出如何从JSON文件中删除重复项。这是我的代码:
from urllib.request import urlopen
from bs4 import BeautifulSoup as soup
import json
urls = ['https://open.bccampus.ca/find-open-textbooks/',
'https://open.bccampus.ca/find-open-textbooks/?start=10']
data = []
#opening up connection and grabbing page
for url in urls:
uClient = urlopen(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("h4")
for container in containers:
item = {}
item['type'] = "Textbook"
item['title'] = container.parent.a.text
item['author'] = container.nextSibling.findNextSibling(text=True)
item['link'] = "https://open.bccampus.ca/find-open-textbooks/" + container.parent.a["href"]
item['source'] = "BC Campus"
data.append(item) # add the item to the list
with open("./json/bc.json", "w") as writeJSON:
json.dump(data, writeJSON, ensure_ascii=False)
下面是JSON输出的示例
^{pr2}$
您不需要删除任何类型的重复项。在
唯一需要的就是更新代码。在
»问题出在哪里?
我知道你想要这个是因为你得到了重复的字典。在
这是因为您选择容器作为
h4
元素&f 或每本书的详细信息,指定页面链接https://open.bccampus.ca/find-open-textbooks/ 和https://open.bccampus.ca/find-open-textbooks/?start=10 有2个h4
个元素。在这就是为什么,你没有得到一个包含20个项目的列表(每页10个)作为容器列表 只获取两倍,即40个项目的列表,其中每个项目是
h4
元素。在对于这40个项目,你可能会得到不同的值,但问题是在选择家长时。 因为它给出了相同的元素,所以文本也是一样的。在
让我们通过假设下面的伪代码来澄清这个问题。在
»»容器=第页_汤。找到所有(“h4”);将给出下面的
^{pr2}$h4
元素的列表。在»»对于您的代码,内部for循环的第一次迭代将把下面的元素称为容器变量。在
»»第二次迭代将以下元素称为容器变量。在
»»在上述两个内部for循环迭代中,容器.父对象;将给出下面的元素。在
»»和容器.父对象.a将给出下面的元素。在
»»最后,容器.父对象.a.text将下面的文本作为前两本书的书名。在
这就是为什么我们会得到重复的字典,因为我们的动态
title
&;author
也是相同的。在让我们把这个问题一一解决。在
»网页详细信息:
每个网页都有10本教科书的详细信息。
每本书的细节都有2个
h4
元素。总共,2x10x2=40
h4
个元素。»我们的目标:
我们的目标是只得到20个字典的数组/列表,而不是40个。
所以需要迭代containers列表2项,即。 在每次迭代中跳过一个项目。
»修改工作代码:
»输出:
最后,我尝试修改您的代码,并向dictionary对象添加更多细节
description
,date
&;categories
。在»修改后的工作代码(增强版):
»输出(增强版):
就这样。谢谢。在
我们最好使用集合数据结构而不是列表。它不保留顺序,但不存储像list这样的重复项。在
更改您的代码
到
^{pr2}$以及
到
明白了。以下是其他人遇到此问题时的解决方案:
相关问题 更多 >
编程相关推荐