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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 13:25:31