Scrapy使用XPath提取Status字段返回空值问题排查
问题排查结论
你的XPath逻辑存在2处核心错误,导致无法提取到Status字段值:
- 定位范围错误:循环统计到包含
Status:的span索引后,使用//div[数字]是从整个HTML文档根节点全局查找第N个div,并非line_list_K容器下的对应行div,定位完全偏移。 - 取值路径错误:目标站点详情页的字段值是直接跟在
<span>标签后的同级文本节点,没有嵌套在子div标签内,查找子div文本的逻辑本身就匹配不到目标内容。
正确实现代码
直接通过XPath轴定位匹配目标字段,不需要遍历span算索引,鲁棒性更强,修正后的parse_book方法如下:
def parse_book(self, response): wev = {} # 直接定位Status字段,取span标签后的同级文本,normalize-space兼容多余空白字符 status = response.xpath( "//div[@class='line_list_K']//span[contains(normalize-space(text()), 'Status:')]/following-sibling::text()" ).get(default='').strip() wev['status'] = status print(wev) # 如需批量提取该模块所有律师信息,可使用通用遍历逻辑,无需逐字段写XPath # for field_row in response.xpath("//div[@class='line_list_K']/div"): # field_name = field_row.xpath("./span/text()").get(default='').strip().rstrip(':') # field_value = field_row.xpath("./text()").get(default='').strip() # if field_name: # wev[field_name] = field_value # yield wev
效果验证
针对给出的测试详情页,上述代码可正确提取到status值为Wykonujący zawód,符合页面实际展示内容。如果后续要提取其他同模块字段,直接用注释里的通用遍历逻辑即可,不需要单独为每个字段写定位规则。
内容的提问来源于stack exchange,提问作者Amen Aziz
相关产品推荐
相关产品推荐

