使用Python urllib和BeautifulSoup爬取物流页面表格仅返回script如何解决
问题原因
你要爬取的页面目标物流表格属于前端动态渲染数据:初始静态HTML返回时仅包含JS执行逻辑,表格数据是页面加载完成后,JS异步调用后端接口获取数据后才渲染到DOM树中的。urllib仅能获取未执行JS的初始静态源码,因此无法提取到目标表格。
解决方案
提供两种可落地的处理方案:
方案1:接口逆向直接拉取结构化数据
打开浏览器F12开发者工具,切换到「网络」面板,筛选「XHR/ Fetch」类型的请求,刷新页面后即可找到加载物流数据的后端接口。直接构造请求调用该接口即可拿到JSON格式的结构化物流数据,无需解析HTML,爬取效率最高。请求时注意匹配浏览器请求头中的User-Agent、Referer等参数,避免触发站点反爬策略。方案2:模拟浏览器执行JS渲染后解析
如果不想做接口抓包,可以使用Selenium、Playwright等模拟浏览器工具,加载页面后等待JS执行完成、表格渲染完毕,再提取页面元素。示例代码如下:
# 依赖安装命令:pip install selenium beautifulsoup4 webdriver-manager from selenium import webdriver from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager 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 url = 'https://ekartlogistics.com/shipmenttrack/FMPP0944216480' # 自动管理Chrome驱动,无需手动下载 driver = webdriver.Chrome(service=Service(ChromeDriverManager().install())) driver.get(url) # 等待表格加载完成,最长等待10秒 WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CSS_SELECTOR, "table")) ) # 获取渲染后的完整页面源码 rendered_html = driver.page_source soup = BeautifulSoup(rendered_html, 'html.parser') # 按页面实际属性定位物流表格后提取数据 logistics_table = soup.find("table") print(logistics_table.prettify()) # 关闭浏览器 driver.quit()
内容的提问来源于stack exchange,提问作者Pruthvi
相关产品推荐
相关产品推荐

