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
相关产品推荐
相关产品推荐

