Selenium+BS4爬取表格异常:仅获单个单元格求助
问题:爬取网站表格仅返回单个单元格
我在练习爬取目标网站的表格时遇到问题:只能打印出表格的1个单元格,无法获取完整表格。目标网站地址:https://stats.paj.gr.jp/en/pub/current_en_n2.html
我的代码如下:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from bs4 import BeautifulSoup import pandas as pd path = "C:\\Users\Jun Hui\\Desktop\\Quant Trading\\chromedriver-win32\\chromedriver.exe" service = webdriver.chrome.service.Service(path) service.start() url = "https://stats.paj.gr.jp/en/pub/current_en_n2.html" driver = webdriver.Chrome(service=service) driver.get(url) link_element1 = driver.find_element(By.XPATH,"//a[@href='index.html']") link_element1.click() link_element2 = driver.find_element(By.XPATH,"//a[@href='./current_en_n2.html']") link_element2.click() page_source = driver.page_source soup = BeautifulSoup(page_source, "html.parser") table = soup.find("table") rows = table.find_all("tr") for row in rows: cells = row.find_all("td") for cell in cells: print(cell.text.strip(), end="\t") print()
问题分析与解决方案
问题原因
- 多余的页面跳转:先访问目标页面又跳转到首页再返回,不仅无意义,还可能导致页面未完全加载就抓取源码,触发元素异常。
- 未等待表格加载:页面存在动态渲染可能,直接获取源码时表格还未完全生成,导致
soup.find("table")仅抓取到部分内容。 - 未处理表头元素:原代码只提取
td数据单元格,遗漏了表头th元素,同时可能丢失行结构信息。
修正后的代码(Selenium+BeautifulSoup)
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 from bs4 import BeautifulSoup import pandas as pd # 配置ChromeDriver路径 path = "C:\\Users\Jun Hui\\Desktop\\Quant Trading\\chromedriver-win32\\chromedriver.exe" service = webdriver.chrome.service.Service(path) driver = webdriver.Chrome(service=service) url = "https://stats.paj.gr.jp/en/pub/current_en_n2.html" driver.get(url) # 显式等待表格加载完成,最长等待10秒,确保页面渲染完毕 wait = WebDriverWait(driver, 10) wait.until(EC.presence_of_element_located((By.TAG_NAME, "table"))) # 获取完整页面源码 page_source = driver.page_source soup = BeautifulSoup(page_source, "html.parser") table = soup.find("table") rows = table.find_all("tr") # 同时处理表头(th)和数据单元格(td) for row in rows: cells = row.find_all(["th", "td"]) for cell in cells: print(cell.text.strip(), end="\t") print() # 关闭浏览器释放资源 driver.quit()
更简洁的方案:直接用Pandas读取表格
该网站表格为静态渲染,可跳过Selenium,用Pandas快速抓取:
import pandas as pd url = "https://stats.paj.gr.jp/en/pub/current_en_n2.html" # 抓取页面中所有表格,返回DataFrame列表 tables = pd.read_html(url) # 取第一个表格(目标表格) target_table = tables[0] # 打印表格内容 print(target_table) # 保存为CSV文件 target_table.to_csv("paj_stats_table.csv", index=False)
内容的提问来源于stack exchange,提问作者Jongjh
相关产品推荐
相关产品推荐

