页码长度计算报错TypeError: object of type 'int' has no len()求助
我来帮你排查这个问题,这个报错本质是你尝试对一个整数类型的变量调用len()方法——而整数根本没有这个方法,自然会报错。结合你的代码和需求,我整理了可能的原因和对应的解决办法:
可能的报错原因
1. 变量被意外覆盖成整数
你的代码里all_page_numbers初始是列表,但如果在循环过程中(或者其他地方)不小心把它重新赋值成了单个页码(比如写成all_page_numbers = page_number而不是all_page_numbers.append(page_number)),那它就从列表变成了整数。后续再对它调用len()(哪怕是转成字符串前),都会触发这个错误。
另外,如果你把page_number转换成了整数(比如加了int(page_number)),然后尝试直接对这个整数调用len()(比如想算页码的位数),也会报同样的错。
2. 错误的长度计算逻辑
看你的注释,你是想计算页面总数,但你写的是len(str(all_page_numbers))——这是把整个列表转成字符串后算字符长度,完全不是你要的“页面总数”。如果你误把代码写成len(all_page_numbers),而此时all_page_numbers又意外变成了整数,那肯定会报错。
对应的解决方法
先确认变量类型(排查第一步)
在报错代码前加一行打印,看看all_page_numbers到底是什么:
print(type(all_page_numbers), all_page_numbers) length_of_page_numbers = len(str(all_page_numbers))
如果输出显示是<class 'int'>,那就是变量被覆盖了,接下来看下面的修复。
修复变量赋值错误
确保all_page_numbers始终是列表,循环里用append添加元素,别写错赋值语句:
all_page_numbers = [] for thematic_break in all_thematic_breaks: # get_text返回的是字符串,先保留原类型,避免后续类型混淆 page_number = thematic_break.previous_sibling.previous_sibling.previous_sibling.get_text(strip=True) all_page_numbers.append(page_number) # 这里一定要用append,别写成赋值
修正页面总数的计算逻辑
如果你要的是“页面总数”(也就是列表里有多少个页码),直接用列表的len()即可,不需要转成字符串:
# 这才是正确的页面总数计算方式 length_of_page_numbers = len(all_page_numbers) print(length_of_page_numbers)
如果要计算单个页码的位数
如果你是想算某个页码的字符长度(比如页码是"100",想知道长度是3),确保对字符串调用len():
for thematic_break in all_thematic_breaks: page_number = thematic_break.previous_sibling.previous_sibling.previous_sibling.get_text(strip=True) # 直接用原字符串算长度,哪怕是数字也没问题 page_digit_length = len(page_number) print(f"页码 {page_number} 的位数是 {page_digit_length}") all_page_numbers.append(page_number)
内容的提问来源于stack exchange,提问作者Vanya Vaid

