Python抓取网页表格生成DataFrame遇concat使用问题求助
解决Selenium抓取国家数据生成Pandas DataFrame的问题
你已经通过Selenium成功抓取并打印了目标网页的国家列数据,但无法生成对应的DataFrame。教程中使用的append方法已被Pandas弃用,尝试concat方法未成功,核心问题是没有正确处理元素文本的提取和DataFrame的创建逻辑。
现有可正常运行的代码(打印国家数据)
import pandas as pd from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome.options import Options from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.keys import Keys url = "https://worldpopulationreview.com/countries" PATH = 'C:/chromedriver_win32/chromedriver.exe' driver = webdriver.Chrome(PATH) driver.get(url) driver.find_element(By.XPATH, "/html/body/div[1]/div/div/div/div[2]/div/button[2]").click() # 关闭弹窗 countries = driver.find_elements(By.XPATH, ("//*[@id='__next']/div/div[3]/section[2]/div[1]/div/div/div/div[3]/div[2]//tbody/tr/td[1]")) for x in countries: print(x.text)
教程中已弃用的append写法
for i in range(len(countries)): df_population = df_population.append({"Countries": countries[i].text})
你尝试的无效代码
df_population = pd.DataFrame(columns=["Countries"]) # 无法填充数据 df_population = pd.concat([pd.DataFrame(**[countries[i].text]**, columns=['Countries']) for i in range(len(countries))], ignore_index=True) # 语法错误+逻辑低效
正确解决方案
最简洁高效的方式是先将所有国家的文本提取为纯字符串列表,再直接用该列表创建DataFrame,完全不需要依赖concat或已弃用的append。
修改后的完整代码
import pandas as pd from selenium import webdriver from selenium.webdriver.common.by import By url = "https://worldpopulationreview.com/countries" PATH = 'C:/chromedriver_win32/chromedriver.exe' driver = webdriver.Chrome(PATH) driver.get(url) driver.find_element(By.XPATH, "/html/body/div[1]/div/div/div/div[2]/div/button[2]").click() # 用列表推导式提取所有国家的文本内容 countries = driver.find_elements(By.XPATH, ("//*[@id='__next']/div/div[3]/section[2]/div[1]/div/div/div/div[3]/div[2]//tbody/tr/td[1]")) country_names = [country.text for country in countries] # 直接从列表创建DataFrame df_population = pd.DataFrame(country_names, columns=["Countries"]) print(df_population) # 记得关闭浏览器释放资源 driver.quit()
无效代码的问题说明
你之前的concat写法存在两个问题:
- 语法错误:代码中的
**[countries[i].text]**多了不必要的双星号,属于非法语法; - 逻辑低效:即使修复语法,循环拼接单行DataFrame的方式性能极差,远不如先收集完整列表再创建DataFrame的方式高效。
内容的提问来源于stack exchange,提问作者jacopo salmistrari
相关产品推荐
相关产品推荐

