如何用BeautifulSoup识别表格数据所属分类并添加对应列?
问题描述
爬取网址https://takipcimerkezi.net/services的表格数据(除“aciklama”外的所有信息),现有代码如下:
from bs4 import BeautifulSoup import requests import pandas as pd import numpy as np url='https://takipcimerkezi.net/services' page= requests.get(url) table=BeautifulSoup(page.content, 'html.parser') max_sipariş= table.find_all(attrs={"data-label":"Maksimum Sipariş"}) maxsiparis=[] for i in max_sipariş: value=i.text maxsiparis.append(value) min_sipariş= table.find_all(attrs={"data-label":"Minimum Sipariş"}) minsiparis=[] for i in min_sipariş: value=i.text minsiparis.append(value) bin_adet_fiyati= table.find_all(attrs={"data-label":"1000 adet fiyatı "}) binadetfiyat=[] for i in bin_adet_fiyati: value=i.text.strip() binadetfiyat.append(value) id= table.find_all(attrs={"data-label":"ID"}) idlist=[] for i in id: value=i.text idlist.append(value) servis= table.find_all(attrs={"data-label":"Servis"}) servislist=[] for i in servis: value=i.text servislist.append(value)
数据存入Excel后,每行包含ID、Servis、最低订单量、最高订单量、千份价格等字段,现在需要新增一列标记每行数据的所属分类:
- ID为“158”的行属于“Önerilen Servisler”分类
- ID为“4”“1526”“1”“1494”……“1537”的行属于“Instagram %100 Gerçek Premium Servisler”分类
解决方案
可以通过两种方式实现分类标记:手动映射或自动从网页提取分类关系。
方法1:手动建立ID-分类映射
适合分类对应ID数量较少的场景:
- 先将现有数据整合到Pandas DataFrame中:
# 整合数据到DataFrame df = pd.DataFrame({ "ID": idlist, "Servis": servislist, "Minimum Sipariş": minsiparis, "Maksimum Sipariş": maxsiparis, "1000 adet fiyatı": binadetfiyat })
- 定义ID与分类的映射字典,补充所有需要标记的ID:
category_mapping = { "158": "Önerilen Servisler", "4": "Instagram %100 Gerçek Premium Servisler", "1526": "Instagram %100 Gerçek Premium Servisler", "1": "Instagram %100 Gerçek Premium Servisler", "1494": "Instagram %100 Gerçek Premium Servisler", "1537": "Instagram %100 Gerçek Premium Servisler" # 其他ID对应的分类可继续添加 }
- 新增“分类”列,用
map()匹配映射关系,未匹配的标记为“其他”:
df["分类"] = df["ID"].map(category_mapping).fillna("其他")
- 保存到Excel:
df.to_excel("服务数据带分类.xlsx", index=False)
方法2:自动从网页提取分类关系
适合分类对应ID数量多、不想手动维护的场景,直接从网页结构中获取分类标题与对应行的关联:
# 提取网页中的分类标题和对应行的ID categories = table.find_all("h3") rows = table.find_all("tr") current_category = None category_id_map = {} for row in rows: # 检查当前行的前一个兄弟节点是否是分类标题h3 h3_tag = row.find_previous_sibling("h3") if h3_tag: current_category = h3_tag.text.strip() # 提取当前行的ID id_cell = row.find(attrs={"data-label":"ID"}) if id_cell and current_category: category_id_map[id_cell.text.strip()] = current_category # 整合数据并添加分类列 df = pd.DataFrame({ "ID": idlist, "Servis": servislist, "Minimum Sipariş": minsiparis, "Maksimum Sipariş": maxsiparis, "1000 adet fiyatı": binadetfiyat }) df["分类"] = df["ID"].map(category_id_map).fillna("其他") # 保存到Excel df.to_excel("服务数据带分类.xlsx", index=False)
这种方法会自动识别网页中每个分类下的所有服务ID,不需要手动维护映射关系,适配网页结构的动态变化。
内容的提问来源于stack exchange,提问作者luthierz
相关产品推荐
相关产品推荐

