Python数据爬取异常:目标网站表格返回空值求助
解决TFDA药品注册页面表格爬取为空的问题
看起来你遇到的核心问题是目标页面的表格是通过JavaScript动态渲染的——直接用requests获取的静态HTML里根本没有这个表格元素,所以BeautifulSoup自然找不到,返回空字符串。
我帮你分析了这个页面,下面给你两种可行的解决方案:
方法1:用Selenium模拟浏览器渲染页面
Selenium可以模拟真实浏览器加载页面、执行所有JavaScript,这样就能拿到完整的渲染后页面,再用BeautifulSoup解析表格。
步骤:
- 先安装Selenium和对应浏览器的驱动(比如ChromeDriver,要和你的Chrome版本匹配)
- 替换你的代码为以下版本:
from bs4 import BeautifulSoup from selenium import webdriver from selenium.webdriver.chrome.options import Options import time # 配置无头模式(不打开浏览器窗口,后台运行) chrome_options = Options() chrome_options.add_argument("--headless=new") chrome_options.add_argument("--disable-gpu") # 初始化浏览器 driver = webdriver.Chrome(options=chrome_options) driver.get("http://tfda.go.tz/portal/registered-products/registered-drug-products-1") # 等待页面加载(表格是动态加载的,给3秒确保渲染完成) time.sleep(3) # 获取渲染后的页面源码 page_source = driver.page_source driver.quit() # 解析页面 soup = BeautifulSoup(page_source, 'html.parser') table = soup.find("table", {"class": "table table-stripped table_productDrugs"}) # 打印表格内容(也可以进一步解析行和列提取数据) print(table.prettify())
方法2:直接抓取后台API接口(更高效)
我通过浏览器开发者工具抓包发现,这个页面的表格数据是通过AJAX请求从后台接口获取的,直接请求接口能拿到包含表格的HTML片段,不用处理页面渲染,效率更高。
步骤:
- 接口地址格式为
http://tfda.go.tz/portal/registered-products/registered-drug-products-1?page=页码,修改page参数即可切换分页 - 直接请求接口并解析返回内容
代码示例:
import requests from bs4 import BeautifulSoup # 请求第1页数据,爬多页可循环修改page参数 url = "http://tfda.go.tz/portal/registered-products/registered-drug-products-1?page=1" 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) # 解析返回的HTML片段 soup = BeautifulSoup(response.text, 'html.parser') table = soup.find("table", {"class": "table table-stripped table_productDrugs"}) # 打印表格或提取具体数据 print(table.prettify())
额外提示:
- 你之前的
sys.stdout编码设置可能导致输出乱码,建议换成UTF-8编码:sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') - 如果要爬取多页数据,只需循环修改
page参数,直到返回的表格为空或无新数据即可
内容的提问来源于stack exchange,提问作者JAXPAROW95
相关产品推荐
相关产品推荐

