关于python:selenium pandas数据帧构造函数未正确调用

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)