Python抓取Yellow Pages仅获每页首个商家,迭代异常求助
问题分析与解决方案
核心问题
代码仅抓取每页第一个商家的原因是选择器逻辑错误:
soup.find_all('div', {'class':'search-results organic'})获取的是整个搜索结果的父容器(每页仅1个),而非容器内的单个商家元素。- 后续
for business in web_page循环只执行一次,且business.find(...)只会提取容器内的第一个商家数据,自然跳过了其他商家。
修复步骤
修正商家元素选择器
将获取商家列表的代码替换为目标商家条目选择器,直接定位到每个商家的DOM元素:# 选择搜索结果容器内的所有商家条目 web_page = soup.find_all('div', {'class': 'result'})或用更简洁的CSS选择器:
web_page = soup.select('div.search-results.organic div.result')优化全局变量使用
全局变量web_page_results会导致多次调用函数时数据累积,建议移到函数内部:def yellow_pages_scraper(search_term, location): web_page_results = [] # 移到函数内部,避免跨调用数据污染 page = 1 while True: # 原有循环逻辑...可选:简化异常处理
利用get_text()的默认值参数减少重复try-except块,让代码更简洁:business_dict['name'] = business.find('a', {'class':'business-name'}).get_text(strip=True, default='') business_dict['street_address'] = business.find('div', {'class':'street-address'}).get_text(strip=True, default='')
修复后的完整代码示例
def yellow_pages_scraper(search_term, location): web_page_results = [] page = 1 while True: url = f'https://www.yellowpages.com/search?search_terms={search_term}&geo_location_terms={location}&page={page}' r = requests.get(url, headers=headers) soup = bs(r.content, 'html.parser') # 修正选择器,定位每个商家条目 web_page = soup.find_all('div', {'class': 'result'}) for business in web_page: business_dict = {} # 简化文本提取的异常处理 business_dict['name'] = business.find('a', {'class':'business-name'}).get_text(strip=True, default='') business_dict['street_address'] = business.find('div', {'class':'street-address'}).get_text(strip=True, default='') business_dict['locality'] = business.find('div', {'class':'locality'}).get_text(strip=True, default='') business_dict['phone'] = business.find('div', {'class':'phones phone primary'}).get_text(strip=True, default='') # 单独处理网站链接的属性提取异常 try: business_dict['website'] = business.find('a', {'class':'track-visit-website'})['href'] except (AttributeError, KeyError): business_dict['website'] = '' web_page_results.append(business_dict) # 判断是否还有下一页 if not soup.find('a', {'class': 'next ajax-page'}): break page += 1 return web_page_results
内容的提问来源于stack exchange,提问作者32kode
相关产品推荐
相关产品推荐

