使用Beautiful Soup爬取eumostwanted.eu人员姓名时如何筛选冗余内容
针对eumostwanted.eu爬取人员姓名的精准选择方案
出现大量冗余内容的核心原因是field-content是Drupal站点的通用容器类,全页面从导航、侧边栏、搜索模块到通缉人员卡片都会复用这个类名,直接单类选择必然会命中大量非目标节点,可通过多层选择器嵌套、属性匹配的方式快速缩小提取范围。
核心筛选逻辑
1. 先锚定目标专属容器
人员姓名全部嵌在每个通缉犯的独立信息卡片中,这类卡片有专属的类名标识(比如views-row、person-card),且不会在页面非人员展示区域出现,可优先用这些专属类把选择范围从全页面缩小到卡片区域,从根源上排除导航、页脚、侧边栏的冗余元素。
2. 组合选择器嵌套缩小范围
不要单独使用通用类做选择,把field-content嵌套在专属容器的选择路径里,比如:
- 先选主内容区的人员列表容器,再选列表下的每个卡片,最后定位卡片内的姓名元素,可层层过滤无关内容
- 利用元素的固有属性做二次筛选:人员姓名都是指向个人详情页的链接,
href属性固定包含/person/路径,这个特征是其他同field-content类元素不具备的,可直接作为精准匹配的依据
3. 常用组合筛选技巧
- 通用类名必须嵌套专属父级选择器使用:只要某个类名在页面出现频次过高,就不要单独作为选择条件
- 支持CSS属性匹配规则:通过
[属性名*="特征值"]的格式,匹配带固定特征的元素,不需要遍历DOM树做二次判断 - 排除非目标区域:如果选择结果仍有冗余,可先锚定主内容区的根容器,仅在该容器范围内做元素选择,跳过侧边栏、页脚的无关节点
优化后可直接运行的测试代码
import requests from bs4 import BeautifulSoup # 补充基础请求头避免被站点拦截 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" } info = requests.get("https://eumostwanted.eu/", headers=headers) soup = BeautifulSoup(info.text, "lxml") # 精准匹配:带/person/路径的field-content元素,直接命中人员姓名 name_nodes = soup.select('a.field-content[href*="/person/"]') # 提取纯文本并去除多余空白 person_name_list = [node.get_text(strip=True) for node in name_nodes] print(person_name_list)
相比最初直接选择
.field-content的逻辑,上述选择器会直接过滤掉搜索提示、页脚链接、侧边栏推荐等同类名的冗余节点,无需额外写复杂的文本判断规则即可拿到完整的人员姓名列表。
内容的提问来源于stack exchange,提问作者Zack Paquette
相关产品推荐
相关产品推荐

