You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python爬虫函数如何自动获取赋值变量名用于调试输出?

问题:爬虫函数自动识别赋值变量名用于调试输出

我正在开发一款网页爬虫,编写了如下自定义函数getting_company,用于接收元素的xpath和列表索引数字,获取对应元素的文本:

def getting_company(xpath, number): 
    try: 
        data_element = driver.find_elements_by_xpath(str(xpath)) 
        all_elements = len(data_element) 
        elemet_text = data_element[int(number)].text 
        print(" this is range of a list : " + str(all_elements)) 
        return elemet_text 
    except: 
        data_element = driver.find_elements_by_xpath(str(xpath)) 
        print(" this is range of a list : " + str(all_elements)) 
        return "not found" 

为调试需求,我添加了try/except块避免程序崩溃并输出元素列表长度,但希望在调用函数时(如variable1 = getting_company(xpath, number)),无需手动传入变量名字符串,让函数自动识别赋值的变量名(如variable1、variable2),并在调试信息中包含该变量名,例如函数执行失败时输出“variable1的元素列表长度为x”这类信息,请问该如何实现?


解决方案

要实现这个需求,我们可以借助Python的inspect模块获取函数调用时的上下文信息,解析出赋值语句里的变量名。下面是具体的实现步骤和优化后的代码:

1. 核心思路

通过inspect模块拿到调用函数的代码帧,提取调用行的源代码,再用正则匹配出赋值语句左侧的变量名,最后把这个变量名嵌入到调试输出里。

2. 修改后的完整函数代码

import inspect
import re

def getting_company(xpath, number):
    # 获取调用者的代码帧,拿到调用行的源代码
    caller_frame = inspect.currentframe().f_back
    caller_line = inspect.getframeinfo(caller_frame).code_context[0].strip()
    
    # 用正则匹配赋值语句左侧的变量名,适配常规的单变量赋值格式
    match = re.match(r'(\w+)\s*=\s*getting_company\(', caller_line)
    var_name = match.group(1) if match else "未知变量"
    
    try:
        data_element = driver.find_elements_by_xpath(str(xpath))
        all_elements = len(data_element)
        # 修正原函数的拼写错误:elemet_text → element_text
        element_text = data_element[int(number)].text
        print(f"[{var_name}] 元素列表长度为 {all_elements},文本获取成功")
        return element_text
    except Exception as e:
        data_element = driver.find_elements_by_xpath(str(xpath))
        all_elements = len(data_element)
        print(f"[{var_name}] 获取失败,元素列表长度为 {all_elements},错误信息: {str(e)}")
        return "not found"

3. 关键细节说明

  • inspect模块的作用:inspect.currentframe().f_back能拿到调用当前函数的代码帧,inspect.getframeinfo则可以提取出该帧对应的源代码行,这是获取变量名的核心依据。
  • 正则匹配逻辑:正则表达式r'(\w+)\s*=\s*getting_company\('专门匹配变量名 = getting_company(...)这类常规赋值格式,能准确提取左侧的变量名;如果调用格式特殊(比如链式赋值、多行赋值),可以根据实际情况调整正则规则。
  • 错误处理优化:把原函数的空except:改成except Exception as e,可以捕获并输出具体错误信息,调试时能更快定位问题。
  • 代码细节修正:修正了原函数中elemet_text的拼写错误,避免潜在的变量名异常。

4. 调用示例

当你像这样调用函数时:

company_name = getting_company("//div[@class='company-item']", 0)

如果执行成功,会输出:

[company_name] 元素列表长度为 8,文本获取成功

如果执行失败(比如索引越界),会输出:

[company_name] 获取失败,元素列表长度为 8,错误信息: list index out of range

内容的提问来源于stack exchange,提问作者Mladen MODD

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:04:37