BeautifulSoup4如何正确爬取相同class的不同span标签内容
BeautifulSoup提取同class不同标签值的修复方案
问题根源
你当前写法失效的核心原因是find_next_sibling的查找范围不符合页面实际DOM结构:两个同class的span虽然是同级元素,但调用时很容易因为两个span中间存在空节点、装饰节点,导致找到的不是薪资对应的span,最终两个字段取值重复。
修复方法
最稳定的写法是在单个岗位卡片的父容器内,一次性查找所有匹配目标class的span,按列表索引取值,不需要逐个查找相邻元素,抗干扰能力更强。
修正后的transform函数代码如下:
def transform(soup): divs = soup.find_all('div', class_ = 'sx2jih0 zcydq876 zcydq866 zcydq896 zcydq886 zcydq8n zcydq856 zcydq8f6 zcydq8eu') for items in divs: # 提取当前岗位卡片下所有匹配class的信息标签 info_tags = items.find_all('span', attrs={'class': 'sx2jih0 zcydq84u _18qlyvc0 _18qlyvc1x _18qlyvc3 _18qlyvc7'}) # 按DOM顺序索引取值,第一个为地点,第二个为薪资 location = info_tags[0].text.strip() # 加容错判断,避免部分岗位未标注薪资导致报错 salary = info_tags[1].text.strip() if len(info_tags) >= 2 else "未公开薪资"
额外优化建议
- 你代码里用到的class包含大量
zcydq8xx、_18qlyvcxx这类带随机哈希值的动态类名,网站前端发版后这类类名大概率会变动,长期运行的爬虫建议结合元素的data-*自定义属性、父级固定结构、相邻固定文本特征做定位,不要完全依赖动态类名。 - 如果提取到的信息顺序和预期不符,可以先打印
info_tags列表里的每个元素文本,确认地点、薪资对应的索引位置再调整即可。
内容的提问来源于stack exchange,提问作者kankerino
相关产品推荐
相关产品推荐

