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

使用Qt5抓取动态JavaScript内容遇到问题求助

解决x-template脚本块的数据提取问题

嘿,我明白你遇到的麻烦了——用PyQt5爬JS渲染的游戏拍卖网站,数据藏在x-template类型的script块里,光拿初始源码根本取不到实际内容对吧?别担心,我帮你调整下代码,让你能正确提取到这些数据。

问题出在哪?

你当前的代码大概率只是获取了页面的初始HTML源码,没等JavaScript完全执行并把数据填充到对应的模板里。要拿到x-template里的实际数据,得在浏览器的JS上下文里直接操作,因为这些模板内容是由页面的JS逻辑处理过的。

修改后的完整代码

def render(source_url):
    import sys
    from PyQt5.QtWidgets import QApplication
    from PyQt5.QtCore import QUrl
    from PyQt5.QtWebEngineWidgets import QWebEngineView

    class Render(QWebEngineView):
        def __init__(self, url):
            self.html = None
            self.app = QApplication(sys.argv)
            super().__init__()
            # 页面加载完成后触发数据提取
            self.loadFinished.connect(self._extract_template_data)
            self.load(QUrl(url))
            self.app.exec_()

        def _extract_template_data(self):
            # 在浏览器环境中执行JS,直接获取x-template内容
            extract_js = """
                // 定位所有x-template类型的script标签
                const templateScripts = document.querySelectorAll('script[type="x-template"]');
                const extractedData = {};

                templateScripts.forEach(script => {
                    // 这里根据你的需求处理内容:如果是JSON就解析,否则直接存文本
                    try {
                        // 假设模板里是JSON格式的数据,替换成你实际的解析逻辑
                        extractedData[script.id || `template-${Array.from(templateScripts).indexOf(script)}`] = JSON.parse(script.textContent.trim());
                    } catch (err) {
                        // 如果不是JSON,直接保存原始文本
                        extractedData[script.id || `template-${Array.from(templateScripts).indexOf(script)}`] = script.textContent.trim();
                    }
                });

                return extractedData;
            """
            # 执行JS并接收返回结果
            self.page().runJavaScript(extract_js, self._handle_extracted_result)

        def _handle_extracted_result(self, result):
            # 把提取到的数据存起来,然后退出应用
            self.html = result
            self.app.quit()

    return Render(source_url).html

关键细节说明

  • 等待页面加载完成:通过loadFinished信号确保页面的基础资源都加载完毕,再执行数据提取的JS代码。
  • 直接在浏览器上下文操作:用runJavaScript方法在页面的JS环境里直接获取x-template的内容,这样就能拿到JS处理后的实际数据,而不是初始源码里的模板框架。
  • 灵活处理内容:加了try-catch逻辑,不管模板里是JSON数据还是纯文本,都能正确保存;还给无id的模板自动生成了标识,方便你区分不同的模板内容。

额外小贴士

  • 先在浏览器里调试JS:如果提取的数据不符合预期,先打开目标网站的开发者工具,把extract_js里的代码复制到控制台执行,看看能不能拿到正确结果,再调整JS逻辑。
  • 处理异步加载:如果页面还有延迟加载的数据,可以给JS代码加个等待逻辑,比如监听window.load事件或者用setTimeout延迟几秒再提取,确保所有数据都已填充完毕。

内容的提问来源于stack exchange,提问作者TheReshi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:28:36