Scrapy中如何用CSS选择器处理标签间的缺失数据?
解决Scrapy抓取中空地址字段的处理问题
我来帮你搞定这个问题!你当前的代码存在两个主要问题:一是CSS选择器的类名大小写错误(HTML里是span.ans,但你写的是span.Ans),二是直接按索引提取文本的方式会因为空的ans标签导致数据错位,而且try-except的处理会丢失有效数据或者返回不规范的item。咱们换一种更可靠的方式来处理,保证即使地址为空也能保留空值,同时结构完全规范。
核心思路
不再依赖固定索引去取答案,而是把每个条目里的「问题标签(span.q)」和「答案标签(span.ans)」一一配对,这样不管哪个答案为空,都能准确对应到对应的字段上。
修改后的完整代码
class NmcSpider(scrapy.Spider): name = 'nmc' allowed_domains = ['nmc.org.np'] start_urls = ['http://nmc.org.np/registered-practitioner.html'] def parse(self, response): self.log('hello ' + response.url) for title in response.css('li.title'): # 1. 提取所有问题文本,处理成干净的键名(去掉末尾的冒号和空格) question_elements = title.css('span.q') field_keys = [ q.css('::text').get(default='').strip().rstrip(':') for q in question_elements ] # 2. 提取所有答案文本,空标签直接返回空字符串 answer_elements = title.css('span.ans') field_values = [ ans.css('::text').get(default='').strip() for ans in answer_elements ] # 3. 将问题和答案配对成字典,保证一一对应 data_map = dict(zip(field_keys, field_values)) # 4. 构建规范的item,用get方法兜底,确保字段始终存在 item = { 'name': data_map.get('Name', ''), 'address': data_map.get('Address', ''), 'gender': data_map.get('Gender', ''), 'degree': data_map.get('Degree', ''), 'nmc_no': data_map.get('NMC No', '') } yield item
关键改进点说明
- 修正CSS选择器:把
span.Ans改成span.ans,匹配HTML里的实际类名,这是原代码可能取不到数据的关键原因之一。 - 避免索引错位:通过遍历所有
ans元素来提取文本,即使标签为空,也会在field_values里保留一个空字符串,不会导致后续字段的索引偏移。 - 字段配对更可靠:用
dict(zip(field_keys, field_values))把问题和答案绑定,不管HTML里的条目顺序是否有变化(如果有特殊情况),都能准确对应到对应的字段。 - 结构始终规范:用
data_map.get(字段名, '')的方式获取值,即使某个字段不存在(比如部分条目没有性别信息),也会返回空字符串,保证item的结构完全一致。
内容的提问来源于stack exchange,提问作者the new guy
相关产品推荐
相关产品推荐

