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

网页爬取问题:医生多服务地点标签类名重复,需提取单个地点

问题:爬取医生信息时仅需单个服务地点却返回全部地点

我正在做一个学校项目,需要爬取医生信息来构建推荐模型。现在遇到的问题是:目标网站里每位医生有多个服务地点,这些地点对应的标签类名完全一样,我只需要获取每位医生的一个服务地点,但目前爬取会返回所有地点。

相关信息:

  • 目标页面:oladoc巴基斯坦拉合尔妇科医生页面
  • 服务地点截图:服务地点示例
  • 地点标签截图:地点标签类名
  • 当前代码截图:当前爬取代码

我试了好多次都没法只提取单个地点,现在爬取的所有地点文本会被追加到列表里,最后存入DataFrame。

解决方案

要解决这个问题,核心是针对单个医生的容器,只提取第一个匹配的地点元素,而不是全局抓取所有同class的地点标签。以下是具体实现思路:

基于BeautifulSoup的实现

  1. 先定位每个医生的独立父容器,确保查找地点的范围是单个医生的区域
  2. 在该容器内,使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 21:27:25