Python+BeautifulSoup提取网页公司名称:前三个正常后续提取失败求助
问题分析与修改方案
原代码只能提取前3个公司名称的核心问题:
- 用
s.find()只获取了第一个职位卡片(card bg-white m-0类的div),后续所有卡片都没被纳入处理范围。 select('p',{'class':'m-0'})的用法错误,BeautifulSoup的select()方法第二个参数不是属性筛选,应该直接用CSS选择器语法,且该选择器会匹配大量无关的p标签,导致遍历逻辑混乱。
修改后的代码方案
方案一:遍历所有职位卡片提取
这种方式逻辑更清晰,便于后续扩展提取其他字段(比如职位名称、发布时间):
import requests from bs4 import BeautifulSoup r = requests.get('https://remote.co/remote-jobs/developer/') s = BeautifulSoup(r.text, 'lxml') # 获取所有职位卡片(用find_all代替find) all_job_cards = s.find_all('div', {'class': 'card bg-white m-0'}) company_names = [] for card in all_job_cards: # 直接在当前卡片内找公司名称的p标签 company_tag = card.find('p', {'class': 'm-0 text-secondary'}) if company_tag: company_name = company_tag.text.strip() print(company_name) company_names.append(company_name)
方案二:直接定位所有公司名称元素(更简洁)
利用CSS选择器直接匹配所有公司名称标签,一步到位:
import requests from bs4 import BeautifulSoup r = requests.get('https://remote.co/remote-jobs/developer/') s = BeautifulSoup(r.text, 'lxml') # 用CSS选择器直接选中所有公司名称的p标签 company_tags = s.select('div.card.bg-white.m-0 p.m-0.text-secondary') company_names = [tag.text.strip() for tag in company_tags if tag.text.strip()] for name in company_names: print(name)
关键修改点说明
- 用
find_all()替代find():确保获取页面上所有的职位卡片,而不是仅第一个。 - 精准定位目标元素:每个公司名称都嵌套在对应职位卡片的
p.m-0.text-secondary标签内,直接在卡片内查找或用层级CSS选择器定位,避免无关元素干扰。 - 简化遍历逻辑:去掉冗余的
find_next_sibling判断,直接提取目标标签的文本内容。
内容的提问来源于stack exchange,提问作者jhgjhgkk
相关产品推荐
相关产品推荐

