网页抓取时tbody标签缺失无法获取PDF下载链接如何解决
问题原因
直接用requests获取不到tbody节点,是因为目标站点的表格tbody内容属于动态渲染数据:初始返回的静态HTML里只有thead结构,tbody里的所有行数据是页面加载完成后,由前端JavaScript发起异步请求拉取,再动态插入到DOM里的。requests不具备执行JS的能力,自然拿不到这部分动态生成的内容。
解决方案
不用模拟浏览器渲染,直接抓取前端调用的后端数据接口效率更高,稳定性也更好:
- 打开目标页面按F12唤起开发者工具,切换到网络面板,筛选XHR类型请求
- 刷新页面后就能找到给表格供数的接口,接口返回结构化的JSON数据,里面包含所有表格行的内容,自然也包含PDF下载链接
- 直接构造请求调用这个接口,解析返回数据就能拿到所有需要的PDF链接
可直接运行的参考代码如下:
from bs4 import BeautifulSoup import requests headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36", "X-Requested-With": "XMLHttpRequest" } # 构造接口请求参数,length参数设为大于总数据量的值即可一次拉取全量数据 params = { "s": "TPU", "draw": 1, "start": 0, "length": 200 } resp = requests.get( "https://www.nexeoplastics.com/types/plastics-product-finder", headers=headers, params=params ) table_data = resp.json() pdf_list = [] for row in table_data.get("data", []): # PDF链接位于行数据的最后一列,是HTML片段格式,直接解析提取即可 col_soup = BeautifulSoup(row[-1], "html.parser") pdf_tag = col_soup.find("a", href=lambda x: x and ".pdf" in x) if pdf_tag: pdf_list.append(pdf_tag.get("href")) # 打印所有提取到的PDF链接 for pdf_url in pdf_list: print(pdf_url)
如果后续接口参数有调整,直接对照浏览器开发者工具里抓到的实际请求参数,替换代码里的params字段即可,不需要解析动态渲染后的页面DOM。
内容的提问来源于stack exchange,提问作者Eric
相关产品推荐
相关产品推荐

