You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 19:09:30