BeautifulSoup爬取仅返回单个父节点链接问题求助
解决BeautifulSoup仅爬取到部分议员链接的问题
问题原因
你使用的sc-907102a3-0 sc-e6d2fd61-0 gOAsvA jBTDjv是前端框架动态生成的类名,这类名称不具备稳定性,且不同字母分组的议员链接可能使用了不同的动态类名,导致findAll只匹配到第一个分组(A开头)的链接。
解决方案
方案一:基于链接href特征匹配
所有议员链接的href均以/sv/ledamoter-och-partier/ledamoterna/开头,用正则匹配该特征即可覆盖所有目标链接:
import requests from bs4 import BeautifulSoup import re url = "https://www.riksdagen.se/sv/ledamoter-och-partier/ledamoterna/" response = requests.get(url) content = BeautifulSoup(response.content, "html.parser") mp_pages = [] # 匹配符合格式的议员链接 mps = content.findAll('a', href=re.compile(r'^/sv/ledamoter-och-partier/ledamoterna/[^/]+/$')) for x in mps: mp_pages.append(x.get('href')) print(mp_pages)
方案二:使用稳定的父容器遍历
先定位所有议员分组的父容器(避免依赖动态类),再在每个分组内提取链接:
import requests from bs4 import BeautifulSoup import re url = "https://www.riksdagen.se/sv/ledamoter-och-partier/ledamoterna/" response = requests.get(url) content = BeautifulSoup(response.content, "html.parser") mp_pages = [] # 定位所有字母分组的容器(可根据页面源码调整选择器) group_containers = content.findAll('div', class_=re.compile(r'sc-[a-f0-9]+-0 sc-[a-f0-9]+-2')) for container in group_containers: # 在分组内提取所有有效议员链接 links = container.findAll('a', href=True) for link in links: if link['href'].startswith('/sv/ledamoter-och-partier/ledamoterna/'): mp_pages.append(link['href']) print(mp_pages)
注意事项
- 动态生成的类名(
sc-前缀)会随前端版本变更失效,爬取时优先使用语义化属性、链接特征或稳定的页面结构定位元素。 - 可通过浏览器开发者工具查看其他分组内链接的属性,验证选择器是否覆盖所有目标元素。
内容的提问来源于stack exchange,提问作者Vanpaia
相关产品推荐
相关产品推荐

