学习BS4爬虫:如何提取链接锚点中ctdata字典内容?
解决BS4提取标签中ctdata字典内容的问题
你的代码之所以输出一堆None,是因为找错了对象——offers.find('ctdata')是在寻找名为<ctdata>的子标签,但实际上ctdata是<a>标签的属性,不是独立的HTML标签,所以肯定找不到内容~
下面是正确的处理步骤和代码:
核心思路
- 先从
<a>标签上直接获取ctdata属性的字符串值 - 把这个字符串形式的字典转换成Python可操作的字典对象
- 从字典里提取你需要的字段(比如
ad_jobtitle)
完整代码示例
import json from bs4 import BeautifulSoup # 替换成你的实际HTML内容 html_content = ''' <a ct="result_offer_content" ctdata = {"ad_id_solr": "1a7d243c3610c62012159b7c9d4e900382bbe446", "ad_id_mongo": "", "ad_segment_id": 1723, "ad_partner": "wizbii.com_premium", "ad_sector": "Ingénierie", "ad_subsector": "", "ad_jobtitle": "Ingénieur développeur", "ad_company": "SII", "ad_type": "exact", "ad_position": 1, "ad_locality": "Bordeaux"}> ''' soup = BeautifulSoup(html_content, 'html.parser') for offer in soup.find_all("a", {'ct':'result_offer_content'}): # 获取ctdata属性值,get方法避免属性不存在时报错 ctdata_raw = offer.get('ctdata') if ctdata_raw: # 将字符串字典转为Python字典 ctdata_dict = json.loads(ctdata_raw) # 提取目标字段,同样用get方法更安全 job_title = ctdata_dict.get('ad_jobtitle') print(job_title)
注意事项
- 必须导入
json模块,因为要把字符串格式的字典解析成Python可操作的字典 - 用
get()方法获取属性和字典字段比直接用索引(比如offer['ctdata'])更安全,遇到属性/字段不存在的情况会返回None而不是直接报错 - 如果遇到
ctdata里用单引号包裹的情况,需要先把单引号替换成双引号再解析:ctdata_raw = ctdata_raw.replace("'", '"'),你的示例里是双引号,所以不需要这一步
内容的提问来源于stack exchange,提问作者user11083208
相关产品推荐
相关产品推荐

