使用Beautiful Soup/Requests下载HTML中不完整URL对应的PDF文件
问题解决方法
报错根因为你提取到的href属性是站点相对路径,未携带协议和域名信息,requests无法基于这类路径直接发起请求,需要你将前缀拼接在请求的URL参数位置。
方案1:直接字符串拼接(适配当前场景)
你可以直接把域名前缀和link.get('href')的结果做字符串拼接,替换原requests.get的入参即可,修改后代码如下:
for link in links: if ('/pdf' in link.get('href', [])): i += 1 print("Downloading file: ", i) # 仅修改这一行,拼接完整URL response = requests.get("https://mdpi.com" + link.get('href'))
当前场景下你拿到的href都是/开头的路径,和不带末尾斜杠的前缀拼接后正好是完整有效URL。
方案2:使用urljoin(通用兼容方案)
如果要适配更多路径格式的场景,避免斜杠重复/缺失的问题,可以用Python标准库的urljoin工具自动拼接路径:
- 首先在代码开头导入工具:
from urllib.parse import urljoin
- 修改请求行代码:
response = requests.get(urljoin("https://mdpi.com", link.get('href')))
额外注意事项
- 建议给
requests.get添加headers参数,设置正常的User-Agent模拟浏览器请求,避免被站点的反爬策略拦截 - 批量下载时建议在每次请求后加1~2秒的延时,降低请求频率,避免给站点造成过大压力,也能减少被封IP的概率
内容的提问来源于stack exchange,提问作者Brian C.
相关产品推荐
相关产品推荐

