无法抓取完整HTML及无标识表格的提取方案求助
解决动态加载表格的提取问题
先修正你当前代码的问题
你的代码存在几处逻辑错误:
- 重复导入
BeautifulSoup HTMLFileToBeOpened变量未定义,这段读取本地文件的逻辑完全多余,你已经通过requests.get获取了网页内容- 同时使用
html.parser和lxml两个解析器,逻辑混乱
修正后的基础请求代码(但仍无法获取动态表格):
from bs4 import BeautifulSoup import requests URL = "https://www.jaivikkheti.in/inputsupplier" page = requests.get(URL) soup = BeautifulSoup(page.content, "html.parser") print(soup.body.prettify())
为什么拿不到表格?
该网站的表格数据是JavaScript动态渲染的(你混淆了Java和JavaScript的概念),requests只能获取初始静态HTML,无法执行页面中的JS代码,因此看不到渲染后的表格内容。
解决方案:使用浏览器渲染工具抓取
推荐用playwright(自带驱动,配置简洁)或selenium模拟浏览器加载页面,等待JS渲染完成后再提取表格。
方法1:使用Playwright
- 安装依赖:
pip install playwright playwright install chromium
- 提取表格的代码:
from playwright.sync_api import sync_playwright from bs4 import BeautifulSoup with sync_playwright() as p: browser = p.chromium.launch(headless=True) # 无界面模式运行 page = browser.new_page() page.goto("https://www.jaivikkheti.in/inputsupplier") page.wait_for_load_state("networkidle") # 等待网络空闲,确保JS加载完成 # 获取渲染后的完整HTML html_content = page.content() browser.close() # 解析HTML提取表格(无class/id,通过标签定位) soup = BeautifulSoup(html_content, "html.parser") target_table = soup.find("table") # 提取表格数据到列表 table_data = [] if target_table: rows = target_table.find_all("tr") for row in rows: cols = row.find_all(["td", "th"]) col_texts = [col.get_text(strip=True) for col in cols] table_data.append(col_texts) # 打印或处理数据 for row in table_data: print(row)
方法2:使用Selenium
- 安装依赖和驱动:
pip install selenium
下载对应浏览器的驱动(如Chrome的chromedriver),确保驱动版本与浏览器匹配,将驱动路径配置到环境变量或代码中。
- 提取表格的代码:
from selenium import webdriver from selenium.webdriver.chrome.options import Options from bs4 import BeautifulSoup from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By # 配置Chrome无界面模式 chrome_options = Options() chrome_options.add_argument("--headless=new") driver = webdriver.Chrome(options=chrome_options) driver.get("https://www.jaivikkheti.in/inputsupplier") # 显式等待表格加载,比sleep更可靠 WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.TAG_NAME, "table"))) # 获取渲染后的HTML html_content = driver.page_source driver.quit() # 解析提取表格 soup = BeautifulSoup(html_content, "html.parser") target_table = soup.find("table") table_data = [] if target_table: rows = target_table.find_all("tr") for row in rows: cols = row.find_all(["td", "th"]) col_texts = [col.get_text(strip=True) for col in cols] table_data.append(col_texts) for row in table_data: print(row)
额外优化思路:寻找后端API接口
打开浏览器开发者工具(F12),切换到网络标签,刷新页面后筛选XHR/Fetch请求,查看是否有直接返回表格数据的API接口。如果找到,直接用requests请求接口获取JSON数据,这种方式比渲染页面更高效。
内容的提问来源于stack exchange,提问作者Ritesh Kumar
相关产品推荐
相关产品推荐

