无class属性时如何抓取指定网页的表格数据?
网页表格数据抓取解决方案
先排查页面加载方式
这个页面的表格大概率是动态加载的——也就是页面初始HTML里没有表格内容,需要通过AJAX请求拉取数据后渲染。直接用BeautifulSoup爬静态HTML自然拿不到内容。你可以打开浏览器F12,切换到Network标签,刷新页面后筛选XHR/Fetch请求,找到返回表格数据的接口。
两种可行的爬虫实现方案
方案一:直接调用数据接口(高效首选)
找到数据接口后,直接请求接口获取JSON数据,无需解析HTML:
import requests import pandas as pd # 替换为你在开发者工具中找到的实际接口URL api_url = "https://www.cbe.org.eg/en/Auctions/Pages/GetBillsHistoricalData.aspx" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" } response = requests.get(api_url, headers=headers) data = response.json() # 转成DataFrame方便后续处理 df = pd.DataFrame(data) print(df.head())
方案二:用Selenium模拟浏览器(兼容所有动态场景)
如果找不到接口,用Selenium模拟浏览器完整加载页面后再提取表格:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager import pandas as pd # 初始化Chrome浏览器 driver = webdriver.Chrome(service=Service(ChromeDriverManager().install())) driver.get("https://www.cbe.org.eg/en/Auctions/Pages/AuctionsEGPTBillsHistorical.aspx") # 等待表格加载(可根据实际加载速度调整等待时间) driver.implicitly_wait(10) # 定位表格:即使没有class,也可以通过标签直接定位,或结合父元素筛选 table = driver.find_element(By.TAG_NAME, "table") # 提取表格数据 rows = table.find_elements(By.TAG_NAME, "tr") data = [] for row in rows: cols = row.find_elements(By.TAG_NAME, "td") row_content = [col.text.strip() for col in cols] if row_content: data.append(row_content) # 转成DataFrame df = pd.DataFrame(data) print(df.head()) # 关闭浏览器 driver.quit()
静态页面场景下的表格定位(备用)
如果页面是静态渲染的,只是表格没有class,可以通过以下方式定位:
import requests from bs4 import BeautifulSoup url = "https://www.cbe.org.eg/en/Auctions/Pages/AuctionsEGPTBillsHistorical.aspx" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" } response = requests.get(url, headers=headers) soup = BeautifulSoup(response.text, "html.parser") # 方式1:遍历所有table标签,通过表头内容筛选目标表格 for table in soup.find_all("table"): table_headers = table.find_all("th") if table_headers and any("Auction Date" in th.text.strip() for th in table_headers): # 找到目标表格,提取数据 rows = table.find_all("tr") for row in rows: cols = row.find_all("td") row_text = [col.text.strip() for col in cols] print(row_text) # 方式2:通过父元素定位,比如表格嵌套在某个特定div下 parent_container = soup.find("div", attrs={"class": "some-container-class"}) # 替换为实际父元素属性 if parent_container: target_table = parent_container.find("table") # 后续提取数据逻辑同上
内容的提问来源于stack exchange,提问作者M_william
相关产品推荐
相关产品推荐

