【问题标题】:Insert data in json file在json文件中插入数据
【发布时间】:2020-05-30 20:34:47
【问题描述】:

代码将错误的结构json插入文件

import requests
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import json

urls = {}
urls['Av'] = {'Áa', 'Bb'}

data = {}
for key, value in urls.items(): 
    for x in value: 

        url = 'https://www.google.pt/search?q=' + key + '%20' + x
        driver = webdriver.Chrome()
        driver.get(url)
        html = driver.page_source

        soup = BeautifulSoup(html, 'html.parser')
        a = soup.find("body")

        for child in a.find_all("div", {'class': 'g'}):
            h2 = child.find("span", {'class': 'Q8LRLc'})
            div = child.find("a", {'class': 'Fx4vi'})

        data[key] = []
        data[key].append({'h2': h2, 'div': div})
        print(data)

        with open("data_file.json", "a") as write_file: 
            json.dump(data, write_file, indent=4)

        driver.quit()

【问题讨论】:

  • 定义“错误结构”,然后继续定义“良好结构”。然后给我们您想要存储的示例数据以及它当前存储的内容。如果您有任何错误,请在代码块中发布完整的堆栈跟踪。
  • 它输出这个: { "Av": [ { "h2": null, "div": null } ] }{ "Av": [ { "h2": null, "div":空}]}
  • 请将此作为编辑包含在代码块中的帖子中,而不是作为评论
  • 顺便说一句,with open("data_file.json", "a") 要非常小心。这意味着您要追加到文件中,每次都编写一个新版本的data。这将导致在技术上无效的.json 文件。您的意思是在 for 循环结束后拥有这个吗?
  • @Alvaro 你还没有更新你的问题而不是评论部分。投票结束此问题,直到添加更多详细信息。

标签: python json file


【解决方案1】:

我看到了很多问题,大多数是应该在循环之外的东西,或者应该在循环之外的东西。

  • 您在循环for child in a.find_all("div", {'class': 'g'}): 内设置变量h2div,但在循环外将它们添加到data,因此只会添加最后一个值。
  • 另外,你在循环内为每个键初始化数据,应该在外面完成,否则每次都会重新初始化。
  • 你也每次打开文件追加到它,我只做一次。
  • 而且,您在每个循环中都初始化您的驱动程序。
  • requestsselenium.webdriver.chrome.options.Options 都是未使用的导入

所以,我会这样改变它:

urls = {}
urls['Av'] = {'Áa', 'Bb'}

data = {}
driver = webdriver.Chrome()
with open("data_file.json", "a") as write_file: 
    for key, value in urls.items():
        data[key] = []. # initialize only once per key

        for x in value: 
            url = 'https://www.google.pt/search?q=' + key + '%20' + x
            driver.get(url)
            html = driver.page_source
            soup = BeautifulSoup(html, 'html.parser')
            a = soup.find("body")

            for child in a.find_all("div", {'class': 'g'}):
                h2 = child.find("span", {'class': 'Q8LRLc'})
                div = child.find("a", {'class': 'Fx4vi'})
                data[key].append({'h2': h2, 'div': div})  # update data for every h2/div found

    json.dump(data, write_file, indent=4) # This write can be done once, outside all loops!

driver.quit()

对我来说有点难测试,但希望能有所帮助!快乐编码!

【讨论】:

  • 我认为你应该首先load JSON 文件,然后update 获取数据,最后将其写入文件dump
猜你喜欢
  • 1970-01-01
  • 2019-12-24
  • 2019-09-12
  • 1970-01-01
  • 2013-09-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-13
  • 2023-03-29
相关资源
最近更新 更多