Python BeautifulSoup爬取遍历URL列表始终返回首个页面内容排查
问题原因
你传入的所有URL仅末尾#后的哈希锚点不同,HTTP请求不会将锚点部分发送至服务端,因此你每一轮循环发出的请求实际访问的都是同一个地址https://www.stoneagetools.com/waterblast-tools-automated-equipment,服务端返回的HTML内容完全一致。
你看到print(url)能输出正确地址,是因为打印的是你本地存储的完整字符串,和requests实际发出的请求内容无关,所以才会出现不管循环到哪一轮,解析出的标签内容都和第一次完全相同的情况。
修复方法
这个站点的分类切换是前端通过锚点控制内容显隐实现的,所有分类的内容在第一次请求页面时就已经全部加载到HTML中,不需要重复发起多次请求。你只需要请求一次基础页面,再根据每个锚点对应的DOM区块,单独提取区块内的h3标签即可,不需要全局查找所有h3。
修正后的可运行代码如下:
import requests import bs4 urllist = [ 'https://www.stoneagetools.com/waterblast-tools-automated-equipment#exchanger', 'https://www.stoneagetools.com/waterblast-tools-automated-equipment#pipe', 'https://www.stoneagetools.com/waterblast-tools-automated-equipment#surface', 'https://www.stoneagetools.com/waterblast-tools-automated-equipment#tank', 'https://www.stoneagetools.com/waterblast-tools-automated-equipment#boiler', 'https://www.stoneagetools.com/waterblast-tools-automated-equipment#tools', 'https://www.stoneagetools.com/waterblast-tools-automated-equipment#swivels', 'https://www.stoneagetools.com/waterblast-tools-automated-equipment#accessories' ] def Get_Names(urllist): endlist = [] # 所有URL实际对应同一个页面,仅需请求一次 base_url = 'https://www.stoneagetools.com/waterblast-tools-automated-equipment' response = requests.get(base_url) response.encoding = response.apparent_encoding soup = bs4.BeautifulSoup(response.text, 'lxml') for url in urllist: templist = [] print(url) # 提取当前URL对应的锚点ID anchor_id = url.split('#')[-1] # 定位到锚点对应的内容区块 current_section = soup.find(id=anchor_id) # 仅在当前区块内查找h3标签,跳过第一个分类标题 taglist = current_section.find_all('h3') if len(taglist) > 0: del taglist[0] for tag in taglist: # 直接提取标签文本,无需手动替换标签字符串 templist.append(tag.text.strip()) endlist.append(templist) return endlist
补充说明:如果你后续遇到锚点对应内容是异步接口加载的站点,需要打开浏览器开发者工具抓对应的XHR接口请求,直接请求接口拿数据即可,不需要请求带锚点的页面地址。
内容的提问来源于stack exchange,提问作者sleechie
相关产品推荐
相关产品推荐

