You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python抓取Yellow Pages仅获每页首个商家,迭代异常求助

问题分析与解决方案

核心问题

代码仅抓取每页第一个商家的原因是选择器逻辑错误:

  • soup.find_all('div', {'class':'search-results organic'})获取的是整个搜索结果的父容器(每页仅1个),而非容器内的单个商家元素。
  • 后续for business in web_page循环只执行一次,且business.find(...)只会提取容器内的第一个商家数据,自然跳过了其他商家。

修复步骤

  1. 修正商家元素选择器
    将获取商家列表的代码替换为目标商家条目选择器,直接定位到每个商家的DOM元素:

    # 选择搜索结果容器内的所有商家条目
    web_page = soup.find_all('div', {'class': 'result'})
    

    或用更简洁的CSS选择器:

    web_page = soup.select('div.search-results.organic div.result')
    
  2. 优化全局变量使用
    全局变量web_page_results会导致多次调用函数时数据累积,建议移到函数内部:

    def yellow_pages_scraper(search_term, location):
        web_page_results = []  # 移到函数内部,避免跨调用数据污染
        page = 1
        while True:
            # 原有循环逻辑...
    
  3. 可选:简化异常处理
    利用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 02:50:52