如何提取sfma.org.sg会员列表页的分类及商家信息?
解决SFMA商家分类文本提取错误的问题
嘿,我来帮你搞定这个问题!作为Python新手,踩这种BeautifulSoup的小坑太正常啦😉
问题根源分析
你原来的代码逻辑出了点小问题:
- 你先把
category(所有class为clink的a标签)的href属性提取出来存到links里,这时候links已经变成了一串URL字符串,不再是BeautifulSoup的Tag对象了。 - 之后你循环
links去取.text,字符串根本没有.text属性,自然拿不到分类文本,甚至会报错。
修正后的代码
我们直接从原始的a标签对象里提取分类文本和链接,分开处理就好:
# 先获取页面上所有分类的a标签元素 category_tags = soup_2.find_all('a', attrs={'class':'clink'}) # 提取分类名称(文本内容) cat_names = [tag.text.strip() for tag in category_tags] # 提取分类对应的链接(可选,如果你需要跳转到分类页爬商家) cat_urls = [tag['href'] for tag in category_tags]
这样cat_names就是你要的分类文本(比如"Alcoholic Beverage"、"Bottled Beverage"),cat_urls则是每个分类对应的页面链接,方便后续爬取商家信息。
完整流程示例(爬分类+商家信息)
给你一个更完整的代码框架,方便你后续提取商家的名称、地址等信息:
import requests from bs4 import BeautifulSoup # 基础分类页面URL base_category_url = "https://www.sfma.org.sg/member/category/" # 1. 获取所有分类信息 response = requests.get(base_category_url) soup = BeautifulSoup(response.text, 'html.parser') category_tags = soup.find_all('a', class_='clink') categories = [] for tag in category_tags: categories.append({ 'name': tag.text.strip(), 'url': tag['href'] }) # 2. 遍历每个分类,爬取商家信息 for cat in categories: print(f"正在爬取分类: {cat['name']}") cat_response = requests.get(cat['url']) cat_soup = BeautifulSoup(cat_response.text, 'html.parser') # 这里需要根据分类页的HTML结构提取商家信息 # 示例(假设商家信息在class为'merchant-card'的容器里): merchant_cards = cat_soup.find_all('div', class_='merchant-card') for card in merchant_cards: # 提取商家名称 merchant_name = card.find('h3').text.strip() # 提取地址 merchant_address = card.find('p', class_='address').text.strip() # 提取联系方式 merchant_contact = card.find('p', class_='contact').text.strip() # 整理商家信息(包含所属分类) merchant_info = { 'name': merchant_name, 'address': merchant_address, 'contact': merchant_contact, 'categories': [cat['name']] # 可以根据页面补充更多分类标签 } print(merchant_info)
小提示
- 爬取前记得查看网站的
robots.txt,确保允许爬虫访问; - 可以给请求加个
headers模拟浏览器,避免被反爬; - 如果商家的分类标签在详情页,记得进入商家详情页后再提取完整的分类信息。
内容的提问来源于stack exchange,提问作者ss_0708
相关产品推荐
相关产品推荐

