【问题标题】:Problems with "for" inserting into a database“for”插入数据库的问题
【发布时间】:2021-07-26 00:17:54
【问题描述】:

使用 Selenium 抓取后(Test1 的 20 个名称列表和 Test2 的 20 个名称列表),我想将这些保存在数据库中:在一个名为“name”的垂直列中。所以我想保存 40 个不同的行,都在同一个名称列中,所以有 40 个不同的名称。刮擦发生正确。他刮掉了所有 40 个名字

插入数据库时​​出现问题:只保存了几个名字(例如只有5、6、7个名字),但都被定期刮掉了。怎么解决?我应该使用追加吗?如果是这样怎么办?我应该对我的代码进行什么更改?显然也像我一样在控制台中打印结果

你能告诉我我在输入数据库时​​哪里出错了吗?谢谢

    #Test 1
    driver.minimize_window()
    driver.get("link")
    for Test1 in driver.find_elements(By.CSS_SELECTOR, "a[href^='/xxxx'][class^='xxxx']"):
        Test1_text = Test1.text
        print(Test1_text)
    driver.close


    #Test 2
    driver.minimize_window()
    driver.get("link")
    for Test2 in driver.find_elements(By.CSS_SELECTOR, "a[href^='/xxxx'][class^='xxxx']"):
        Test2_text = Test2.text
        print(Test2_text)
    driver.close


# INSERT IN DATABASE
    con = sqlite3.connect('/home/blablabla/Desktop/Database.db')
    cursor = con.cursor()

    Values = ((Test1_text,), (Test2_text,))
    sqlite_insert_query = 'INSERT INTO NewTest (Name) VALUES (?);'
    count = cursor.executemany(sqlite_insert_query, Values)
    con.commit()
    print(" ")
    print("Record inserted successfully ", cursor.rowcount)
    records_added_Risultati = records_added_Risultati + 1
    cursor.close()

【问题讨论】:

  • 当你说Test1_text = Test1.text时,你失去了前面的值。
  • @Jeremy Kahan 是的。我这样做是因为否则我在数据库中有问题,因为保存的数据的名称并没有出现在数据库中,而是写有 selenium34803948 的长文本(类似的东西,我记不太清了)。您能帮我将 for 的整个列表正确保存在数据库中吗?只保存了几个名字。
  • 哦,我明白你为什么需要 ,text,我的意思是第一个条目的 Test1.text,比如说,当你开始写入数据库时​​,它不再存在。有两种方式可以去这里。 1. 将值存储在数组中并稍后添加(您的“追加想法”)或 2. 将它们写入数据库。

标签: python python-3.x sqlite selenium selenium-webdriver


【解决方案1】:

问题似乎是 Test1_text 和 Test2_text 每次通过循环都会更新,因此当循环结束时,它们只保存找到的最后一个值。因此,您的 SQL Insert 将仅插入最后两个值(我无法解释您将如何获得 5、6 或 7,除非它可能将 James D. Com 解释为 3 个不同的名称)。有两种方法可以解决这个问题。我在这里画草图,而不是写完美的代码,因为我不能轻易地测试它。

方式1:立即将名称写入数据库。所以你会在第一次测试之前提出这部分:

con = sqlite3.connect('/home/blablabla/Desktop/Database.db')
cursor = con.cursor()
sqlite_insert_query = 'INSERT INTO NewTest (Name) VALUES (?);'
records_added = 0

以及您的print(Test1_text) 添加地址:

count = cursor.execute(sqlite_insert_query, (Test1_text,))
records_added = records_added + 1# or say + count, should be the same

(无需多次执行)。

因此:

Test1_text = Test1.text
print(Test1_text)#put first so in case of error, you know where it happened
count = cursor.execute(sqlite_insert_query, (Test1_text,))
records_added = records_added + 1

同样,你有你的print(Test2_text)

Test2_text = Test2.text
print(Test2_text)#put first so in case of error, you know where it happened
count = cursor.execute(sqlite_insert_query, (Test2_text,))
records_added = records_added + 1

我认为你的提交和关闭(关闭肯定保持不变)可以保持不变,但你可以在每次插入后尝试提交。此外,没有Values=executes 发生在循环之外。在你的 con.commit 之后,你现在可以说:

print("Records inserted successfully: ", records_added)

方式2.积累价值

tests1_and2_text=[]

在第一个 for 循环之前的某个地方。打印 test1_text 后,执行 tests1_and2_text.append((Test1_text,)) 并在打印 Test2_text 的位置进行类似操作。 稍后,设置您的 Values = tests1_and2_text 并查看它是否有效(它应该;您可能需要修改您所附加的内容,我正在使用您的语法)当您执行您的 executemany 时。

【讨论】:

  • 我正在尝试使用方法 1。我按照你告诉我的做了。然后我插入 count = cursor.execute (sqlite_insert_query, Test1_text) "between" Test1_text = Test1.text 并打印。是你说的那个地方吗?我做得很好?我对测试 2 做了同样的事情。虽然我得到了一个错误,也许是关于 Vaules 我把它保持不变。在实践中,我的脚本中有 6 个测试,但作为一个例子,我只在问题中包含了 2 个。所以我得到这个错误:sqlite3.ProgrammingError:Incorrect number of bindings provided.当前语句使用1,提供了6个。如何解决?谢谢
  • 这看起来像是我尝试传递纯字符串的错误。给我一点时间,我会更新的。
  • 我更新为在要添加的文本周围添加括号,因此它知道它只是一个参数。我还试图澄清声明的去向(基本上你有它的地方)。请尝试并报告。
  • 一切正常。谢谢。你太棒了。抓取再次正常工作,所有内容都正确保存在数据库中。一个问题:保存了 99 个数据,即一列中有 99 个单词。但是,打印的最终结果是 1。它打印:记录插入成功 1.我写了 print ("Record插入成功", cursor.rowcount) 然后records_added_Results=records_added_Results +1. 结果不应该是99吗?我怎样才能得到结果99而不是1?P.S:什么如果我在最终关闭时只输入一次“commit”,或者每次输入后都使用它,会有区别吗?谢谢
  • 使用方式 1,您需要在每次插入时记录_added_Results=records_added_Results +1(并在任何测试之前设置为 0)并使用该变量而不是 cursor.rowcount 来打印。 Cursor.rowcount 保存最后一个操作的行数,该操作以方法 1 的工作方式仅插入一行。我认为一次提交意味着如果在事情没有从内存保存到数据库的过程中发生一些错误(所以它是全部或全部)。多次提交意味着它会立即写出每一个。我认为单次提交的性能会更好。
猜你喜欢
  • 1970-01-01
  • 2014-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-01
  • 1970-01-01
  • 2014-01-29
相关资源
最近更新 更多