网页爬取问题:医生多服务地点标签类名重复,需提取单个地点
问题:爬取医生信息时仅需单个服务地点却返回全部地点
我正在做一个学校项目,需要爬取医生信息来构建推荐模型。现在遇到的问题是:目标网站里每位医生有多个服务地点,这些地点对应的标签类名完全一样,我只需要获取每位医生的一个服务地点,但目前爬取会返回所有地点。
相关信息:
- 目标页面:oladoc巴基斯坦拉合尔妇科医生页面
- 服务地点截图:

- 地点标签截图:

- 当前代码截图:

我试了好多次都没法只提取单个地点,现在爬取的所有地点文本会被追加到列表里,最后存入DataFrame。
解决方案
要解决这个问题,核心是针对单个医生的容器,只提取第一个匹配的地点元素,而不是全局抓取所有同class的地点标签。以下是具体实现思路:
基于BeautifulSoup的实现
- 先定位每个医生的独立父容器,确保查找地点的范围是单个医生的区域
- 在该容器内,使用
find()方法(而不是find_all())获取第一个地点标签,或者对find_all()的结果取索引[0]
示例代码(需替换为实际的标签类名):
import requests from bs4 import BeautifulSoup import pandas as pd url = "https://oladoc.com/pakistan/lahore/gynecologist" resp = requests.get(url) soup = BeautifulSoup(resp.text, "html.parser") # 存储数据的列表 doctor_names = [] doctor_locations = [] # 遍历每个医生的容器(替换为实际的医生容器类名) for doctor_card in soup.find_all("div", class_="doctor-card-class"): # 获取医生姓名(替换为实际的姓名标签类名) name = doctor_card.find("h3", class_="doctor-name-class").get_text(strip=True) # 获取第一个服务地点 first_location = doctor_card.find("span", class_="location-class").get_text(strip=True) doctor_names.append(name) doctor_locations.append(first_location) # 存入DataFrame df = pd.DataFrame({ "医生姓名": doctor_names, "服务地点": doctor_locations })
基于Scrapy的实现
如果用Scrapy框架,可以在XPath表达式里通过[1]选取第一个匹配的地点节点:
# 针对每个医生容器,取第一个地点 //div[@class='doctor-card-class']//span[@class='location-class'][1]/text()
这样就能保证每个医生只对应一个服务地点,不会把所有地点都追加到列表里。
内容的提问来源于stack exchange,提问作者Yahya Khalid
相关产品推荐
相关产品推荐

