selenium pandas dataframe constructor not properly called
此代码的目的是从一个表中抓取网页并提取数据,然后将其转换为PANDAS数据帧。
抓取和数据提取进展顺利。
输出如下:
发布日期
时间
实际
预报
以前的
2018年9月9日(8月)
21:30
0.7%
0.5%
0.3%
2018年8月8日(7月)
21:30
0.3%
0.2%
- 0.1%
2018年7月9日(6月)
21:30
- 0.1%
0.1%
- 0.2%
2018年6月8日(5月)
21:30
- 0.2%
- 0.1%
- 0.2%
2018年5月9日(4月)
21:30
- 0.2%
- 0.1%
- 1.1%
2018年4月10日(3月)
21:30
- 1.1%
- 0.5%
1.2%
2018年3月8日(2月)
21:30
1.2%
0.8%
0.6%
2018年2月8日(1月)
21:30
0.6%
0.7%
0.3%
但当我试图将其转换为数据帧时,我得到了一个错误。
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import pandas as pd url = 'https://www.investing.com/economic-calendar/chinese-cpi-743' driver = webdriver.Chrome(r"D:\Projects\Tutorial\Driver\chromedriver.exe") driver.get(url) wait = WebDriverWait(driver,10) while True: try: item = wait.until(EC.visibility_of_element_located((By.XPATH,'//*[contains(@id,"showMoreHistory")]/a'))) driver.execute_script("arguments[0].click();", item) except Exception:break for table in wait.until(EC.visibility_of_all_elements_located((By.XPATH,'//*[contains(@id,"eventHistoryTable")]//tr'))): data = [item.text for item in table.find_elements_by_xpath(".//*[self::td or self::th]")] for data in data: df = pd.DataFrame(data.strip(), columns=['Release Date', 'Time', 'Actual', 'Forecast', 'Previous']) print(df) |
错误如下:
回溯(最近一次呼叫的最后一次):
文件"d:/projects/tutorial/ff.py",第22行,indf=pd.dataframe(data.strip(),columns=["发布日期"、"时间"、"实际"、"预测"、"上一个"])
文件"c:userssayedanaconda3libsite packagespandascoreframe.py",第422行,init中raise valueerror("未正确调用数据帧构造函数!")
值错误:未正确调用数据帧构造函数!
只需更改最后一部分
1 2 3 4 5 6 7 8 | df = pd.DataFrame(columns=['Release Date', 'Time', 'Actual', 'Forecast', 'Previous']) pos = 0 for table in wait.until(EC.visibility_of_all_elements_located((By.XPATH,'//*[contains(@id,"eventHistoryTable")]//tr'))): data = [item.text for item in table.find_elements_by_xpath(".//*[self::td]")] if data: df.loc[pos] = data[0:5] pos+=1 print(df) |