【问题标题】:how to save to a new csv file every time it goes through the loop per page每次通过每页循环时如何保存到新的csv文件
【发布时间】:2020-04-10 16:00:26
【问题描述】:
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from bs4 import BeautifulSoup
import pandas as pd
from pymongo import MongoClient
import tkinter as tk
from tkinter import filedialog
from pandas import DataFrame
from datetime import datetime

# launch WMS
url = "https://inserturlhere.com/solution/login.htm"
driver = webdriver.Chrome(ChromeDriverManager().install())
driver.get(url)

#Login start
username = driver.find_element_by_id("username")
username.clear()
username.send_keys("xxx")

password = driver.find_element_by_id("password")
password.clear()
password.send_keys("xxx")

driver.find_element_by_id("loginButton").click()
#login end


# set variables
pageSize = 200
pageNo = 0
currentView = 33362
entityName = "Item"
now = datetime.now()

def get_filename_datetime():
    return str(entityName) + "-" + str(now.strftime("%d%m%Y-%H%M%S")) +".csv"

for pageNo in range(10):
    url2 = "https://inserturlhere.com/solution/entitylist.htm?entityName=Item&tabName=Item&pageNo={pageNo}&pageSize={pageSize}&currentViewId={currentView}".format(pageNo=pageNo, pageSize=pageSize, currentView=currentView)
    # open shipments page
    driver.get(url2)
    html = driver.page_source
    dfs = pd.read_html(html, attrs={"class":"roundedTable"}, header=5)
    for df in dfs:
        df.dropna(how="all", axis="columns", inplace=True)
        df.drop({"No", "Process Action"}, axis="columns", inplace=True)
        df.dropna(how='all', axis=0, inplace=True)
        df.append(dfs)
        df.to_csv(get_filename_datetime(), index=False)

大家好。我如何修改上面的代码以在每次循环每页时保存一个新的 csv?现在,它只保存一个包含最后一页的文件。

如果需要更多数据,请告诉我!谢谢!

【问题讨论】:

  • 您测试过get_filename_datetime 是否有效? for df in dfs: 您正在迭代某些东西 - df.append(dfs)iterable 附加到项目 - 这似乎有点奇怪。那是故意的吗?为我们创建一个minimal minimal reproducible example 可能会帮助您解决问题。用铅笔和纸浏览你的代码通常很有启发性。 - How to debug small programs
  • 当您在 to_csv 调用之前打印 get_filename_datetime() 时,您得到了预期的结果吗?
  • 嗨,二战,是的,get_filename_datetime 正在工作,就文件名而言,我得到了我所期望的。但是,它只保存了我循环到 csv 文件中的最后一页。它并没有真正将每页的结果附加到我的 df 中。正如您所指出的,我可能完全错误地执行了附加操作。如果我可以将结果放入一个数据框中,那将比每页获取一个 csv 文件更理想。这实际上是我的目标,但我不知道该怎么做。请告诉我!谢谢!

标签: python pandas selenium web-scraping beautifulsoup


【解决方案1】:

问题是文件名永远不会改变,所以循环会不断地覆盖它。目前只有 1 个值,不会随着时间的推移而改变。

entityName = "Item"
now = datetime.now()

def get_filename_datetime():
    return str(entityName) + "-" + str(now.strftime("%d%m%Y-%H%M%S")) +".csv"

顺便说一句,正如 wwii 所指出的那样,循环似乎也有错误,因为您将数据帧列表 (dfs) 附加到单个数据帧。如果您的意图是浏览页面上的所有 HTML 表格,进行一些修改,然后将它们组合起来,您应该将修改后的 df 附加到一个新列表中,然后连接并保存它。

modified_dfs = []
for df in pd.read_html(html, attrs={"class":"roundedTable"}, header=5):
    df = df.dropna(how="all", axis="columns")
    df = df.drop({"No", "Process Action"}, axis="columns")
    df = df.dropna(how='all', axis=0)
    modified_dfs.append(df)
pd.concat(modified_dfs).to_csv('unique_filename', index=False)

【讨论】:

  • 修改了我的代码,现在可以使用了!还。感谢您为我提供有关附加/连接的解决方案!像魅力一样工作!
【解决方案2】:

您可以使用pageNo 作为唯一编号添加到文件名:

df.to_csv(f'{get_filename_datetime()}_{pageNo}', index=False)

【讨论】:

  • 谢谢!我进行了一些修改,现在它正在保存每页结果! df.to_csv(get_filename_datetime()+ "_" + str({pageNo})
  • 酷!如果您接受我的回答,我们可以关闭问题:-)
  • 我在那里使用 f-strings,但它们是 Python 3.6 之后的新功能:realpython.com/python-f-strings
  • 嗨,知道如何将所有结果合并到一个数据帧中,然后只创建一个 CSV 文件吗?
  • 是的,但这是一个不同的问题。
【解决方案3】:

还没有尝试过,但可能是您的 dfs for 循环运行在秒以下。尝试在循环中添加 1 秒延迟。

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from bs4 import BeautifulSoup
import pandas as pd
from pymongo import MongoClient
import tkinter as tk
from tkinter import filedialog
from pandas import DataFrame
from datetime import datetime
import time

# launch WMS
url = "https://inserturlhere.com/solution/login.htm"
driver = webdriver.Chrome(ChromeDriverManager().install())
driver.get(url)

#Login start
username = driver.find_element_by_id("username")
username.clear()
username.send_keys("xxx")

password = driver.find_element_by_id("password")
password.clear()
password.send_keys("xxx")

driver.find_element_by_id("loginButton").click()
#login end


# set variables
pageSize = 200
pageNo = 0
currentView = 33362
entityName = "Item"
now = datetime.now()

def get_filename_datetime():
    return str(entityName) + "-" + str(now.strftime("%d%m%Y-%H%M%S")) +".csv"

for pageNo in range(10):
    url2 = "https://inserturlhere.com/solution/entitylist.htm?entityName=Item&tabName=Item&pageNo={pageNo}&pageSize={pageSize}&currentViewId={currentView}".format(pageNo=pageNo, pageSize=pageSize, currentView=currentView)
    # open shipments page
    driver.get(url2)
    html = driver.page_source
    dfs = pd.read_html(html, attrs={"class":"roundedTable"}, header=5)
    for df in dfs:
        df.dropna(how="all", axis="columns", inplace=True)
        df.drop({"No", "Process Action"}, axis="columns", inplace=True)
        df.dropna(how='all', axis=0, inplace=True)
        df.append(dfs)
        df.to_csv(get_filename_datetime(), index=False)
        time.sleep(1)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-22
    • 1970-01-01
    • 1970-01-01
    • 2018-10-12
    • 2018-02-13
    • 1970-01-01
    • 2022-01-15
    相关资源
    最近更新 更多