抓取指定页面body元素class属性并写入TXT文件时脚本无输出的技术求助
脚本无反应的问题排查与修复方案
嘿,我帮你仔细捋了下这个Python脚本,它运行后没动静主要是几个关键的逻辑错误、属性匹配问题,还有一个容易忽略的细节导致的,下面给你拆解问题点,再附上修复后的完整代码:
核心问题分析
- 属性名完全写错了:目标页面的body标签属性是
data-containr="body",但你脚本里写的是datacontainer_="body",这直接导致BeautifulSoup找不到任何元素,后续代码自然不会执行。 find_all返回值处理错误:find_all返回的是元素列表,你直接调用.get('class')会触发AttributeError(列表没有这个方法),但因为没加异常捕获,脚本直接静默终止了。- 文件操作逻辑有问题:
- 用
"r"模式打开不存在的adidaslive.txt会直接报错,导致脚本停掉; - 直接判断
url not in rf是完全错误的,rf是文件对象,不能这么做,得先把文件内容读成字符串再判断; - 你获取的
url其实是class属性的列表,直接写入文件会变成['cms-no-route', ...]这种不友好的格式,得转成字符串。
- 用
- 没调用定义好的函数:原脚本只写了
get()函数的定义,但最后没执行get(),这也是脚本运行后啥也不做的重要原因! - 缺导入语句:脚本里用到了
requests、BeautifulSoup和randomheaders,但没写导入,运行时会先报NameError,直接终止。
修复后的完整代码
import requests from bs4 import BeautifulSoup # 确保你已经安装了randomheaders库,或者替换成自定义的请求头 import randomheaders def get(): try: # 发送请求获取页面源码 source = requests.get( "https://shop.adidas.ae/en/yeezy-boost-350-v2-ash-pearl/GY7658.html", headers=randomheaders.LoadHeader() ).text soup = BeautifulSoup(source, 'lxml') # 正确匹配data-containr属性:BeautifulSoup用下划线替代HTML属性的连字符 body_tag = soup.find('body', data_containr="body") if not body_tag: print("没找到目标body标签,可能页面结构更新了?") return # 把class列表转成空格分隔的字符串,方便写入文件 class_list = body_tag.get('class') class_str = ' '.join(class_list) filename = "adidaslive.txt" # 处理文件:先读取现有内容,判断是否已存在 existing_content = "" try: with open(filename, "r", encoding="utf-8") as rf: existing_content = rf.read() except FileNotFoundError: # 文件不存在,直接跳过读取,后面会自动创建 pass if class_str not in existing_content: print(f"发现新内容,已写入:{class_str}") with open(filename, "a", encoding="utf-8") as af: af.write("\n" + class_str) else: print("内容已经存在啦,不用重复写入") except Exception as e: print(f"运行时出错了:{str(e)}") # 执行定义好的函数 get()
关键修复点说明
- 属性匹配修正:把错误的
datacontainer_="body"改成data_containr="body",对应原标签的data-containr属性(BeautifulSoup会自动把HTML属性的连字符转成下划线作为关键字参数)。 - 元素获取修正:用
find()替代find_all(),因为页面只有一个body标签,直接获取单个元素更高效,也避免了列表处理的麻烦。 - 文件逻辑优化:
- 加入了文件不存在的异常处理,避免报错;
- 把class列表转成字符串,写入文件更整洁;
- 先读取文件内容再判断是否重复,逻辑更合理。
- 添加异常捕获:外层的
try-except能捕获请求失败、解析错误等各种异常,让你能看到具体错误信息,而不是莫名其妙的无反应。 - 添加函数调用:补上了
get()函数的执行语句,这是原脚本最容易忽略的点!
内容的提问来源于stack exchange,提问作者Vodoom dxb
相关产品推荐
相关产品推荐

