BeautifulSoup迭代访问指定位置链接重复跳转代码问题排查
问题描述
- 需求:使用BeautifulSoup实现指定规则的网页链接跳转抓取:首先打印初始URL,之后每次定位当前页面第3个链接并访问,累计完成4次跳转,依次输出所有访问过的URL。
- 初始访问页面:
http://python-data.dr-chuck.net/known_by_Fikret.html - 故障现象:代码运行后输出的跳转路径和预期结果不符,经排查确认代码始终读取初始页面的链接列表,跳转至新页面后没有重新解析新页面内容提取链接。
故障原因
代码中解析页面提取a标签列表的逻辑只在初始阶段执行了一次,后续跳转循环中没有针对新打开的页面重新发起请求、解析DOM、提取最新的a标签列表,全程遍历的都是初始页面的链接集合,导致跳转逻辑错误。同时原有代码使用两层计数变量做位置判断,逻辑冗余容易引发计数偏差。
修复方案
将页面解析、a标签提取的逻辑移入跳转循环内,每次拿到新的URL后重新解析当前页面内容;直接通过列表索引定位目标位置的链接(注意Python列表为0起始索引,第3个位置对应索引值为2),简化冗余计数逻辑。
修复后可直接运行的完整代码如下:
import urllib.request, urllib.parse, urllib.error from bs4 import BeautifulSoup import ssl # 忽略SSL证书校验错误 ctx = ssl.create_default_context() ctx.check_hostname = False ctx.verify_mode = ssl.CERT_NONE url = "http://py4e-data.dr-chuck.net/known_by_Fikret.html" repeat_times = 4 target_pos = 3 print("Retrieving: ", url) for _ in range(repeat_times): # 请求当前页面内容 html = urllib.request.urlopen(url, context=ctx).read() soup = BeautifulSoup(html, 'html.parser') # 每次跳转后重新提取当前页面所有a标签 tags = soup('a') # 按索引取目标位置链接(0起始索引所以减1) url = tags[target_pos - 1].get('href', None) print("Retrieving: ", url)
运行验证
执行上述代码后将得到和预期完全一致的输出:
Retrieving: http://py4e-data.dr-chuck.net/known_by_Fikret.html Retrieving: http://py4e-data.dr-chuck.net/known_by_Montgomery.html Retrieving: http://py4e-data.dr-chuck.net/known_by_Mhairade.html Retrieving: http://py4e-data.dr-chuck.net/known_by_Butchi.html Retrieving: http://py4e-data.dr-chuck.net/known_by_Anayah.html
内容的提问来源于stack exchange,提问作者Kadar
相关产品推荐
相关产品推荐

