little-one 2019-10-21 10:52 采纳率: 0%
浏览 150

python 用pyqt4无法获取到jss的内容

url="http://so.eastmoney.com/web/s?keyword=002697&pageindex=1"
app=QApplication([])
webview=QWebView()
loop=QEventLoop()
webview.loadFinished.connect(loop.quit)
webview.load(QUrl(url))
loop.exec_()
html=webview.page().mainFrame().toHtml()
with open("test.txt","w") as f:
f.write(html)

我想获取这个页面的jss内容,但是我下载下来的内容仍然不包括jss的内容,也就是span中没有内容
![图片说明](https://img-ask.csdn.net/upload/201910/21/1571626245_843423.png)

但是我在网页上点击检查得到的确实时有内容的:
![图片说明](https://img-ask.csdn.net/upload/201910/21/1571626304_661667.png)

求解



  • 写回答

1条回答 默认 最新

  • 禾戊之昂 Python领域新星创作者 2024-04-07 13:32
    关注

    在网页开发中,JavaScript(JS)常常用于动态地修改页面内容。在你所提到的案例中,网页上的某些内容(比如你提到的span元素中的文本)可能是通过JavaScript在页面加载完成后动态添加的。这就是为什么当你使用QWebView的toHtml方法获取页面HTML时,并没有看到这些动态添加的内容。

    为了获取这些由JavaScript动态生成的内容,你需要确保JavaScript在QWebView中完全执行完毕。仅仅等待页面加载完成(loadFinished信号)可能并不足以捕获这些动态内容,因为页面加载完成并不意味着所有的JavaScript都已执行完毕。

    下面是一些建议的改进方案:

    使用QTimer等待JavaScript执行完毕:
    你可以在页面加载完成后设置一个定时器,等待一段时间,然后再获取页面的HTML内容。这样可以给JavaScript执行一些时间。

    使用QWebFrame的evaluateJavaScript方法:
    你可以尝试使用evaluateJavaScript来执行一段JavaScript代码,这段代码会返回你想要的内容。例如,你可以尝试执行一个返回特定span元素内容的JavaScript函数。

    监听JavaScript的window.onload或DOMContentLoaded事件:
    你可以在页面加载时注入JavaScript代码,监听这些事件,并在它们触发时获取页面内容。

    下面是一个简单的例子,展示了如何使用QTimer来等待JavaScript执行:

    from PyQt4.QtWebKit import QWebView, QWebPage  
    from PyQt4.QtCore import QUrl, QApplication, QEventLoop, QTimer  
      
    url = "http://so.eastmoney.com/web/s?keyword=002697&pageindex=1"  
    app = QApplication([])  
    webview = QWebView()  
      
    def get_html():  
        html = webview.page().mainFrame().toHtml()  
        with open("test.txt", "w") as f:  
            f.write(html)  
        app.quit()  
      
    def on_load_finished():  
        # 使用QTimer等待JavaScript执行  
        timer = QTimer()  
        timer.timeout.connect(get_html)  
        timer.start(2000)  # 等待2秒  
      
    webview.loadFinished.connect(on_load_finished)  
    webview.load(QUrl(url))  
      
    loop = QEventLoop()  
    loop.exec_()
    

    请注意,上面的代码仅仅是一个示例,它使用了一个简单的2秒定时器来等待JavaScript执行。这种方法并不是很可靠,因为不同的网页和不同的JavaScript执行时间可能会有很大的差异。

    一个更可靠的方法是尝试分析网页的JavaScript代码,找到负责填充你想要的数据的部分,并尝试使用evaluateJavaScript来直接获取这些数据。然而,这种方法需要更多的网页开发知识,并且可能需要对每个不同的网页进行定制化的处理。

    最后,值得注意的是,PyQt4和PyQt5已经有一段时间没有更新了,并且它们对应的QtWebKit模块在新版本的浏览器中可能不再支持某些现代网页特性。如果你正在开发一个需要处理现代网页的应用,考虑升级到PyQt5并使用QtWebEngine模块可能是一个更好的选择。

    评论

报告相同问题?

悬赏问题

  • ¥15 无线电能传输系统MATLAB仿真问题
  • ¥50 如何用脚本实现输入法的热键设置
  • ¥20 我想使用一些网络协议或者部分协议也行,主要想实现类似于traceroute的一定步长内的路由拓扑功能
  • ¥30 深度学习,前后端连接
  • ¥15 孟德尔随机化结果不一致
  • ¥15 apm2.8飞控罗盘bad health,加速度计校准失败
  • ¥15 求解O-S方程的特征值问题给出边界层布拉休斯平行流的中性曲线
  • ¥15 谁有desed数据集呀
  • ¥20 手写数字识别运行c仿真时,程序报错错误代码sim211-100
  • ¥15 关于#hadoop#的问题