Python 在excel文件中以两张表的形式保存已删除的文档

Python 在excel文件中以两张表的形式保存已删除的文档,python,excel,python-3.x,web-scraping,pyexcel,Python,Excel,Python 3.x,Web Scraping,Pyexcel,我创建了一个scraper,用来解析网页中的一些文档,并将其保存到一个excel文件中,创建两张工作表。但是,当我运行它时,我可以看到它只将最后一个链接的文档保存在一张表单中,而应该有两张表单包含来自两个链接的文档。我甚至打印了结果以查看背景中发生了什么,但我发现没有任何错误。我觉得第一张纸被覆盖了,第二张永远不会被创建。如何绕过此问题,以便将数据保存在excel文件中的两张表格中。提前感谢您的关注 这是我的密码: import requests from lxml import html fr

我创建了一个scraper,用来解析网页中的一些文档,并将其保存到一个excel文件中,创建两张工作表。但是,当我运行它时,我可以看到它只将最后一个链接的文档保存在一张表单中,而应该有两张表单包含来自两个链接的文档。我甚至打印了结果以查看背景中发生了什么,但我发现没有任何错误。我觉得第一张纸被覆盖了,第二张永远不会被创建。如何绕过此问题,以便将数据保存在excel文件中的两张表格中。提前感谢您的关注

这是我的密码:

import requests
from lxml import html
from pyexcel_ods3 import save_data

name_list = ['Altronix','APC']

def docs_parser(link, name):   
    res = requests.get(link)
    root = html.fromstring(res.text)
    vault = {}
    for post in root.cssselect(".SubBrandList a"):
        if post.text == name:
            refining_docs(post.attrib['href'], vault)

def refining_docs(new_link, vault):
    res = requests.get(new_link).text
    root = html.fromstring(res)  
    sheet = root.cssselect("#BrandContent h2")[0].text   
    for elem in root.cssselect(".ProductDetails"):
        name_url = elem.cssselect("a[class]")[0].attrib['href']
        vault.setdefault(sheet, []).append([str(name_url)])
        save_data("docs.ods", vault)

if __name__ == '__main__':
    for name in name_list:
        docs_parser("http://store.immediasys.com/brands/" , name)
但是,当我为另一个站点编写代码时,它满足了创建不同的工作表并在这些工作表中保存文档的期望。以下是链接:

问题:我发现第一张纸被覆盖,而第二张永远不会被创建。如何绕过此问题,以便将数据保存在excel文件中的两张表格中

您可以在每个附加的链接上覆盖工作簿文件。
您应该决不调用
在循环中保存数据(…
),只在脚本结束时一次

比较您的两个脚本,没有任何差异,两个脚本的行为相同,一次又一次地覆盖工作簿文件。在短时间内覆盖工作簿文件超过160次时,文件IO可能会过载

第一个脚本应创建13张工作表:

data sheet:powerpivot-etc links:20
data sheet:flappy-owl-videos links:1
data sheet:reporting-services-videos links:20
data sheet:csharp links:14
data sheet:excel-videos links:9
data sheet:excel-vba-videos links:20
data sheet:sql-server-videos links:9
data sheet:report-builder-2016-videos links:4
data sheet:ssrs-2016-videos links:5
data sheet:sql-videos links:20
data sheet:integration-services links:19
data sheet:excel-vba-user-form links:20
data sheet:archived-videos links:16
vault sheet:Altronix links:16
vault sheet:APC links:16
第二个脚本应创建2张工作表:

data sheet:powerpivot-etc links:20
data sheet:flappy-owl-videos links:1
data sheet:reporting-services-videos links:20
data sheet:csharp links:14
data sheet:excel-videos links:9
data sheet:excel-vba-videos links:20
data sheet:sql-server-videos links:9
data sheet:report-builder-2016-videos links:4
data sheet:ssrs-2016-videos links:5
data sheet:sql-videos links:20
data sheet:integration-services links:19
data sheet:excel-vba-user-form links:20
data sheet:archived-videos links:16
vault sheet:Altronix links:16
vault sheet:APC links:16

save_data(…
必须作为
\uuu main\uuuu
中的最后一条语句调用一次。感谢stovfl的建议。您所说的方式解决了这个问题。但是,请按照我在上面粘贴的链接,我在那里为另一个站点编写了代码,我发现那里的结果没有任何错误。我从未使用过“save_data”“main”中的参数声明。为什么会有差异?顺便说一句,请提供它作为答案,因为你的建议很有说服力。链接代码与此处的代码大不相同。因此,你的过程不同,因此在保存文件方面也存在差异。很可能是数据的形状/格式被废弃。链接代码怎么会有这么大的差异?我在你的代码中没有发现任何逻辑statement.Shape、format等与在启用javascript之前不创建任何单独的表单无关。感谢stovfl的回答。我现在可以理解数据是如何被刮取的。但是,我提出了我的问题,因为第二个脚本也没有按照您在回答中所说的逻辑进行。调用“save_data”在“main”中不过,语句是有效的!您解释了该机制应该如何工作,但忘记提到为什么第二个脚本的行为不同,因为它只创建了一个工作表而不是两个。@Topto:我已经测试了您的两个脚本,没有发现任何差异。为什么在工作簿文件中只找到最后一个工作表的解释是由于每次
保存_数据(…
Dict
数据/vault
已清除。感谢stovfl所做的一切。我当时不在电脑旁,因此延迟了响应。