Python爬虫优化:如何用BeautifulSoup仅通过单个for循环提取两类不同class的h2标签下的span内容
重构你的Indeed爬虫:合并循环并优化代码
嘿,作为Python新手能独立写出爬虫已经超棒了!针对你想只用一个for循环处理两类标题的需求,我们可以通过几种方式重构代码,让它更简洁、符合Pythonic的编码规范,同时还能提升扩展性。
方法1:合并两个结果列表
你可以把title1和title2的结果合并成一个列表,然后用单个for循环遍历这个合并后的列表,避免重复的代码块:
def transform(soup): title1 = soup.find_all('h2', class_='jobTitle jobTitle-color-purple') title2 = soup.find_all('h2', class_='new topLeft') # 合并两个结果列表 all_titles = title1 + title2 for item in all_titles: # 增加容错:防止找不到span元素时报错 title_span = item.find('span') if title_span: print(title_span.text)
方法2:用CSS选择器一次性匹配所有目标元素
BeautifulSoup支持CSS选择器,我们可以用逗号分隔多个选择器,一次性获取所有符合条件的h2标签,省去两次find_all的重复操作:
def transform(soup): # 用CSS选择器同时选中两个类的h2元素 all_titles = soup.select('h2.jobTitle.jobTitle-color-purple, h2.new.topLeft') for item in all_titles: title_span = item.find('span') if title_span: print(title_span.text)
进阶优化:返回数据而非直接打印
为了让代码更灵活(比如后续要保存数据到文件或数据库),建议让transform函数返回标题列表,而不是直接打印——这更符合“单一职责”的编程原则:
def transform(soup): all_titles = soup.select('h2.jobTitle.jobTitle-color-purple, h2.new.topLeft') job_titles = [] for item in all_titles: title_span = item.find('span') if title_span: job_titles.append(title_span.text.strip()) # 用strip()去除文本多余空格 return job_titles # 调用示例 c = extract(0) titles = transform(c) for title in titles: print(title)
内容的提问来源于stack exchange,提问作者ppincus
相关产品推荐
相关产品推荐

