
在进行网络爬虫时,我们经常会遇到网页结构复杂、信息重复或混杂的情况。一个常见的挑战是,目标数据(例如,一个医生在不同地点的服务诊所)可能共享相同的html标签和类名。如果仅仅通过类名进行简单的选择,往往会抓取到所有相关数据,包括我们不想要的部分(例如,线上咨询服务)。本教程将展示如何利用python的requests库和beautifulsoup库,结合高级css选择器,精确地从这类复杂结构中提取和过滤所需信息。
假设我们需要从一个医生信息网站上抓取医生的执业地点。网站上的每个医生可能在多个地点提供服务,并且这些地点在HTML结构中都使用相同的类名标识。更具体地,某些地点可能是物理诊所,而另一些则可能是“在线视频咨询”。我们的目标是:
仅仅通过listing-locations类名选择,将无法区分物理地点和在线咨询,导致数据冗余。
为了解决上述问题,我们可以利用BeautifulSoup强大的CSS选择器功能,特别是其对伪类(pseudo-classes)的支持,来实现更精细的数据筛选。
下面是实现上述目标的代码:
立即学习“Python免费学习笔记(深入)”;
import requests
from bs4 import BeautifulSoup
# 目标网页URL
url = "https://oladoc.com/pakistan/lahore/gynecologist"
try:
# 发送HTTP GET请求获取网页内容
response = requests.get(url)
response.raise_for_status() # 检查请求是否成功,如果失败则抛出HTTPError
# 使用BeautifulSoup解析HTML内容
soup = BeautifulSoup(response.content, "html.parser")
# 遍历页面上每个医生的信息块
# 每个医生信息都包含在class为"gynecologist"的div中
for doctor_block in soup.select(".gynecologist"):
# 提取医生姓名
# 医生姓名通常在每个医生信息块的h2标签中
name_element = doctor_block.h2
if name_element:
doctor_name = name_element.get_text(strip=True)
print("姓名:", doctor_name)
else:
print("未找到医生姓名")
continue # 如果没有姓名,则跳过当前医生
# 提取医生的服务地点
# 关键步骤:使用CSS选择器过滤掉“在线视频咨询”
# .listing-locations:not(:-soup-contains('Online Video Consultation'))
# 解释:
# - .listing-locations: 选择所有class为"listing-locations"的元素
# - :not(...): 排除符合括号内条件的元素
# - :-soup-contains('Online Video Consultation'): Beautiful Soup特有的伪类,
# 选择包含文本"Online Video Consultation"的元素。
# 综合起来,这个选择器会选择所有class为"listing-locations"的元素,
# 但会排除那些内容包含"Online Video Consultation"的元素。
hospital_elements = doctor_block.select(
".listing-locations:not(:-soup-contains('Online Video Consultation'))"
)
# 从过滤后的地点元素中提取医院名称
hospitals = []
for h_elem in hospital_elements:
span_text = h_elem.span.text if h_elem.span else ''
if span_text:
hospitals.append(span_text.strip())
# 打印医生的物理服务地点列表
print("物理地点:", hospitals)
print("-" * 30) # 分隔线,方便阅读
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")
except Exception as e:
print(f"处理数据时发生错误: {e}")
导入库和设置URL:
获取网页内容:
遍历医生信息块:
提取医生姓名:
核心过滤逻辑——提取服务地点:
提取医院名称并打印:
运行上述代码,您将获得类似以下格式的输出,其中每个医生只列出其物理服务地点,不包含在线咨询:
姓名: Dr. Ayesha Azam Khan 物理地点: ['National Hospital & Medical Centre (DHA)', 'Surgimed Hospital (Gulberg)'] ------------------------------ 姓名: Dr. Maliha Amjad 物理地点: ['Omar Hospital & Cardiac Centre (Johar Town) (Johar Town)', 'Shalamar Hospital (Mughalpura)'] ------------------------------ 姓名: Dr. Sara Rasul 物理地点: ['Hameed Latif Hospital (New Garden Town)', 'Hameed Latif Medical Center (DHA)'] ------------------------------ ...
通过本教程,我们学习了如何利用requests和BeautifulSoup库,结合高级CSS选择器(特别是:-soup-contains()和:not()),有效地处理网络爬虫中相同标签类名下的多重数据,并实现对特定信息的精准过滤。这种方法使得从复杂网页结构中提取所需数据变得更加灵活和强大,是进行高效和精确网络爬虫的关键技能之一。掌握这些技术将帮助您在数据采集项目中应对各种挑战。
以上就是Python网络爬虫:利用CSS选择器精准提取与过滤复杂网页数据的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号