使用PyChrome关闭标签页时触发JSONDecodeError错误的求助
PyChrome关闭标签页时触发JSONDecodeError错误的求助
看起来你遇到的是pychrome库内部线程在关闭标签页时的JSON解析错误——虽然你的脚本能正常获取目标元素的文本,但在执行tab.stop()时,库的后台线程还在尝试读取Chrome调试接口的消息,结果收到了空内容,导致JSON解析失败。我来帮你梳理下可能的原因和解决办法:
错误回顾
你遇到的具体错误栈如下:
Exception in thread Thread-1 (_recv_loop): Traceback (most recent call last): File "C:\Users\Administrator2\AppData\Local\Programs\Python\Python313\Lib\threading.py", line 1041, in _bootstrap_inner self.run() File "C:\Users\Administrator2\AppData\Local\Programs\Python\Python313\Lib\threading.py", line 992, in run self._target(*self._args, **self._kwargs) File "C:\Users\Administrator2\AppData\Local\Programs\Python\Python313\Lib\site-packages\pychrome\tab.py", line 122, in _recv_loop message = json.loads(message_json) File "C:\Users\Administrator2\AppData\Local\Programs\Python\Python313\Lib\json\__init__.py", line 346, in loads return _default_decoder.decode(s) File "C:\Users\Administrator2\AppData\Local\Programs\Python\Python313\Lib\json\decoder.py", line 345, in decode obj, end = self.raw_decode(s, idx=_w(s, 0).end()) File "C:\Users\Administrator2\AppData\Local\Programs\Python\Python313\Lib\json\decoder.py", line 363, in raw_decode raise JSONDecodeError("Expecting value", s, err.value) from None json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
根据你的编辑说明,这个错误仅在尝试关闭标签页时触发,核心问题是pychrome的_recv_loop线程没有正确处理Chrome调试连接关闭后的空消息。
可能的解决方案
1. 调整标签页的关闭顺序
尝试先调用Chrome的Page.close方法关闭标签页,再停止pychrome的监听线程,给Chrome足够的时间处理关闭请求:
# 替换原来的tab.stop()代码块 try: # 先关闭标签页 tab.call_method("Page.close") time.sleep(1) # 等待Chrome处理关闭操作 finally: tab.stop()
2. 给pychrome打猴子补丁修复空消息问题
因为错误来自pychrome内部的_recv_loop方法,我们可以通过猴子补丁在空消息到达时跳过解析,避免抛出错误。在你的脚本开头(导入pychrome之后)添加以下代码:
import json from pychrome import tab # 保存原始的_recv_loop方法 original_recv_loop = tab.Tab._recv_loop def patched_recv_loop(self): while self._running: try: message_json = self._ws.recv() # 新增判断:如果消息为空,直接跳过解析 if not message_json: continue message = json.loads(message_json) self._message_queue.put(message) except Exception as e: # 如果线程还在运行状态,忽略错误;否则退出循环 if not self._running: break # 替换pychrome内部的方法 tab.Tab._recv_loop = patched_recv_loop
这个补丁会在收到空消息时直接跳过JSON解析,从根源上避免JSONDecodeError。
3. 考虑Python版本降级
pychrome最后一次更新是在2019年,可能和Python 3.13(较新版本)存在兼容性问题。如果上述方法无效,可以尝试将Python版本降级到3.12或更早,旧版本的Python和pychrome的适配性会更好。
4. 更换为维护更活跃的替代库
由于pychrome已经多年未维护,长期来看推荐更换为更活跃的Web自动化库,比如:
- Playwright:微软维护的跨浏览器自动化库,API简洁,支持Chrome/Firefox/Safari,维护频率高
- Selenium:经典的Web自动化库,配合ChromeDriver也能轻松实现DOM元素提取
这些库不仅能解决当前的错误,还能提供更稳定的长期支持。
备注:内容来源于stack exchange,提问作者Dot Brian
相关产品推荐
相关产品推荐

