使用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
相关产品推荐
相关产品推荐

