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

使用BeautifulSoup爬取YellowPages时提取文本出现冗余评分数字问题

解决Yellow Pages页面提取信息时的评分冗余问题

我懂你碰到的麻烦了——当商家有评分时,直接用.text提取info-primary的内容会把评分数字也混进来,这是因为评分元素嵌套在这个div里,但其实咱们只需要商家的核心信息对吧?下面给你两种靠谱的解决办法:

方法1:移除评分元素后提取文本

这种方法是先把包含评分的元素从DOM树里删掉,再提取剩余内容的文本,这样就不会有冗余数字了:

from bs4 import BeautifulSoup
import requests

# 注意修正URL里的&为&,否则请求可能异常
source = requests.get('https://www.yellowpages.com/search?search_terms=bestbuy+10956&geo_location_terms=10956').text
soup = BeautifulSoup(source, 'lxml')

for article in soup.find_all("div", {"class": "result"}):
    info_primary = article.find("div", {"class": "info-section info-primary"})
    # 定位评分元素(Yellow Pages里评分在class为rating的a标签中)
    rating_element = info_primary.find("a", {"class": "rating"})
    if rating_element:
        rating_element.decompose()  # 彻底移除该元素
    # 提取清理后的文本,用换行分隔不同信息,同时去掉多余空格
    clean_info = info_primary.get_text(strip=True, separator='\n')
    print(clean_info)
    print("---")

这里用decompose()方法把评分元素从父节点中移除,之后再用get_text()提取内容,就能得到干净的商家信息了。

方法2:精准提取目标子元素(更推荐)

如果需要结构化的信息(比如名称、地址、电话分开),直接定位到具体的子元素是更稳妥的方式,完全不会受到评分元素的干扰:

from bs4 import BeautifulSoup
import requests

source = requests.get('https://www.yellowpages.com/search?search_terms=bestbuy+10956&geo_location_terms=10956').text
soup = BeautifulSoup(source, 'lxml')

for article in soup.find_all("div", {"class": "result"}):
    info_primary = article.find("div", {"class": "info-section info-primary"})
    
    # 提取商家名称
    business_name = info_primary.find("a", {"class": "business-name"}).get_text(strip=True)
    # 提取地址信息(做了空值判断避免报错)
    street_addr = info_primary.find("div", {"class": "street-address"}).get_text(strip=True) if info_primary.find("div", {"class": "street-address"}) else "无街道地址"
    locality = info_primary.find("div", {"class": "locality"}).get_text(strip=True) if info_primary.find("div", {"class": "locality"}) else "无区域信息"
    full_address = f"{street_addr}, {locality}"
    # 提取电话
    phone = info_primary.find("div", {"class": "phones phone primary"}).get_text(strip=True) if info_primary.find("div", {"class": "phones phone primary"}) else "无联系电话"
    
    print(f"商家名称: {business_name}")
    print(f"完整地址: {full_address}")
    print(f"联系电话: {phone}")
    print("---")

这种方式不仅避免了冗余内容,还能把信息拆分成独立字段,后续存入数据库或者做分析都更方便。

另外要注意:原URL里的&是HTML转义字符,要改成普通的&,不然requests发送的请求URL会有问题,导致返回的页面内容不符合预期。

内容的提问来源于stack exchange,提问作者T D

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:21:26