如果一个页面已经完全加载到 QWebView 上,我如何获取特定图像的数据(可能通过 dom?)
请您参考如下方法:
我会试着尝试一下:
如果您想使用 jQuery 获取图像的 url,您可以使用如下方法:
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.QtWebKit import *
app = QApplication(sys.argv)
web = QWebView()
web.load(QUrl("http://google.com"))
frame = web.page().mainFrame()
web.show()
def loadFinished(ok):
print 'loaded'
frame.evaluateJavaScript("""
//this is a hack to load an external javascript script
//credit to Vincent Robert from http://stackoverflow.com/questions/756382/bookmarklet-wait-until-javascript-is-loaded
function loadScript(url, callback)
{
var head = document.getElementsByTagName("head")[0];
var script = document.createElement("script");
script.src = url;
// Attach handlers
var done = false;
script.onload = script.onreadystatechange = function()
{
if( !done && ( !this.readyState
|| this.readyState == "loaded"
|| this.readyState == "complete") )
{
done = true;
// Continue your code
callback();
}
};
head.appendChild(script);
}
// This code loads jQuery and executes some code when jQuery is loaded, using above trick
loadScript("http://code.jquery.com/jquery-latest.js", function(){
//we can inject an image into the page like this:
$(document.body).append('<img src="http://catsplanet.files.wordpress.com/2009/08/kitten_01.jpg" id="kitten"/>');
//you can get the url before the image loads like so:
//detectedKittenImageUrl = $('#kitten').attr('src');
//alert('detectedKittenImageUrl = ' + detectedKittenImageUrl);
//but this is how to get the url after it is loaded, by using jquery to bind to it's load function:
$('#kitten').bind('load',function(){
//the injected image has loaded
detectedKittenImageUrl = $('#kitten').attr('src');
alert('detectedKittenImageUrl = ' + detectedKittenImageUrl);
//Google's logo image url is provided by css as opposed to using an IMG tag:
//it has probabled loaded befor the kitten image which was injected after load
//we can get the url of Google's logo like so:
detectedGoogleLogoImageUrl = $('#logo').css('background-image');
alert('detectedGoogleLogoImageUrl = ' + detectedGoogleLogoImageUrl);
});
});
""")
app.connect(web, SIGNAL("loadFinished(bool)"), loadFinished)
sys.exit(app.exec_())
如果你不想每次都从 web 加载 jquery,你可以下载 jquery 然后像这样注入(inject):
jQuerySource = open('jquery.min.js').read()
frame.evaluateJavaScript(jQuerySource)
你也可以根本不使用 jQuery,但它通常会使操作更容易,具体取决于你还想做什么。
如果您想以位图而不是 url 的形式获取图像内容,可以使用 html canvas 对象,我不确定您是否会遇到跨域安全问题。 另一种方法是使用 pyQT 获取显示的图像。如果您有一个具有 alpha 透明度的 PNG,这会更复杂,但是对于不透明的 JPEG,例如,它会更容易。 您可以在 Google 周围搜索一些网页截图代码,了解如何执行此操作,或者您可以从找到的 Python 网址下载。 一旦你在 Javascript 中有了 url 变量,你可能不得不使用 this great slideshow 中介绍的跨界技术。将变量导入 Python 进行下载。
http://www.sivachandran.in/index.php/blogs/web-automation-using-pyqt4-and-jquery也可能是有用的示例代码。
