Selenium获取属性后如何将列表合并为单个DataFrame?
解决Selenium爬虫数据合并为单个DataFrame的问题
嘿,我明白你现在的困扰啦!你每次循环都生成了独立的小DataFrame,但因为没把这些数据保存下来,最后没法合并成一个完整的结果。其实只需要先把所有数据收集起来,再一次性转换成DataFrame就搞定了,给你两种简单的解决方案:
方法一:直接收集数据列表(推荐,更高效)
这种方法先把每一行的数据存入一个空列表,循环结束后再生成完整的DataFrame,避免多次创建小DataFrame的额外开销:
import pandas as pd import numpy as np import requests from csv import writer from selenium import webdriver from selenium.webdriver.chrome.options import Options from webdriver_manager.chrome import ChromeDriverManager from selenium.webdriver.common.keys import Keys chrome_options = Options() chrome_options.add_argument("--headless") driver = webdriver.Chrome(ChromeDriverManager().install()) # 登录流程 url = 'https://accounts.hedgeye.com/users/sign_in' driver.get(url) username = driver.find_element_by_id("user_email") password = driver.find_element_by_id("user_password") username.send_keys("") password.send_keys("") driver.find_element_by_name("commit").click() # 跳转到目标页面 driver.get("https://app.hedgeye.com/feed_items/all?page=1&with_category=33-risk-ranges") # 初始化空列表,用来存储所有行的数据 all_data = [] for tr in driver.find_elements_by_tag_name("tr"): data = tr.get_attribute("innerText") data2 = data.split()[-3:] # 获取每行最后3个元素 all_data.append(data2) # 将当前行数据添加到列表中 # 循环结束后,将列表转为DataFrame final_df = pd.DataFrame(all_data) print(final_df) driver.quit()
方法二:收集小DataFrame后合并
如果你更习惯用DataFrame的操作逻辑,也可以把每次生成的小DataFrame存入列表,最后用pd.concat合并:
import pandas as pd import numpy as np import requests from csv import writer from selenium import webdriver from selenium.webdriver.chrome.options import Options from webdriver_manager.chrome import ChromeDriverManager from selenium.webdriver.common.keys import Keys chrome_options = Options() chrome_options.add_argument("--headless") driver = webdriver.Chrome(ChromeDriverManager().install()) # 登录流程 url = 'https://accounts.hedgeye.com/users/sign_in' driver.get(url) username = driver.find_element_by_id("user_email") password = driver.find_element_by_id("user_password") username.send_keys("") password.send_keys("") driver.find_element_by_name("commit").click() # 跳转到目标页面 driver.get("https://app.hedgeye.com/feed_items/all?page=1&with_category=33-risk-ranges") # 初始化空列表,用来存储所有小DataFrame df_list = [] for tr in driver.find_elements_by_tag_name("tr"): data = tr.get_attribute("innerText") data2 = data.split()[-3:] # 获取每行最后3个元素 df = pd.DataFrame(np.array(data2).reshape(-1, len(data2))) df_list.append(df) # 将小DataFrame添加到列表中 # 合并所有小DataFrame,ignore_index=True重置索引避免重复 final_df = pd.concat(df_list, ignore_index=True) print(final_df) driver.quit()
小提示:
- 方法一的效率更高,因为列表的append操作比多次创建DataFrame要快很多,数据量大的时候差异会更明显。
- 记得检查
data.split()[-3:]是否能稳定获取你需要的数据,如果有些行的元素不足3个,可能会得到不完整的结果,必要时可以加个判断逻辑哦~
内容的提问来源于stack exchange,提问作者Austin Herbert
相关产品推荐
相关产品推荐

