如何修复Python代码实现跨多个URL匹配计数而非仅单个URL生效
问题根因
你的计数逻辑写错了:
- 每次循环都用列表页的初始计数加当前单个页面的匹配数,没有把之前遍历过的员工页结果累加进去,循环每跑一轮就会覆盖上一轮的计数结果,最后输出的自然只有列表里最后一个URL的统计值。
- 初始爬取的员工列表页本身就聚合了所有员工的公开信息,你再单独爬员工页会造成重复统计,手动硬编码URL列表也没法覆盖全部员工,很容易漏数。
修正代码
把计数变量放在循环外做累加,同时自动从列表页提取所有员工详情页链接,不用手动维护URL列表:
import requests from bs4 import BeautifulSoup # 初始化院校计数字典 uni_counts = { "stockholms uni": 0, "lunds uni": 0, "uppsalas uni": 0, "göteborgs uni": 0, "örebros uni": 0, "karlstads uni": 0 } # 抓取员工列表页,提取所有员工详情页链接 list_page = requests.get("https://www.mannheimerswartling.se/medarbetare/") list_soup = BeautifulSoup(list_page.text, "html.parser") employee_links = set() for link in list_soup.find_all("a", href=True): path = link["href"] # 匹配员工详情页的路径规则,自动补全全链接 if path.startswith("/medarbetare/") and path != "/medarbetare/": employee_links.add(f"https://www.mannheimerswartling.se{path}") # 遍历所有员工页累加计数 for emp_url in employee_links: try: resp = requests.get(emp_url, timeout=10) emp_soup = BeautifulSoup(resp.content, "html.parser") text = emp_soup.body.text.lower() for uni in uni_counts: uni_counts[uni] += text.count(uni) except: # 单个页面爬取失败直接跳过,不中断整体统计 continue # 打印结果 print(f"Stockholm: {uni_counts['stockholms uni']}") print(f"Lund: {uni_counts['lunds uni']}") print(f"Uppsala: {uni_counts['uppsalas uni']}") print(f"Göteborg: {uni_counts['göteborgs uni']}") print(f"Örebro: {uni_counts['örebros uni']}") print(f"Karlstad: {uni_counts['karlstads uni']}")
额外说明
- 用字典统一管理计数比单独定义多个零散变量更易维护,后续要加新院校只需要在字典里新增对应键值对即可
- 用集合存储员工链接自动去重,避免同一个页面被重复统计
- 加了简单的异常捕获和超时设置,不会因为单个页面请求失败导致整个脚本崩溃
- 去掉了原代码里对列表页的预统计,避免列表页和详情页内容重复导致计数翻倍
内容的提问来源于stack exchange,提问作者bohol24305
相关产品推荐
相关产品推荐

