我有一个通过GObject自省使用GTK3用Python编写的应用程序(Python 2.7和PyGObject 3.14)。我正在尝试使用WebKit加载网页并访问其加载的所有资源的内容。我可以通过连接到我用来加载页面的WebKitWebView对象的资源加载完成的信号来实现此目的。
在信号处理程序中,我使用web_resource参数中的WebKitWebResource对象来访问已加载的数据。当get_data()返回的GLib.GString不包含NULL字节时,一切都可以正常工作,我可以使用data.str访问所需的内容。但是,当数据确实包含NULL字节时(当加载的资源的MIME类型是图像时,通常是这种情况),data.len是正确的,但是data.str仅包含直到第一个NULL字节的数据。我可以通过调用data.free_to_bytes()返回GLib.GBytes实例来访问原始字节,但是当信号处理程序返回应用程序段错误时。我正在尝试访问已加载资源中的所有数据。
希望以下代码有助于演示该问题。
from gi.repository import Gtk
from gi.repository import WebKit
def signal_resource_load_finished(webview, frame, resource):
gstring = resource.get_data()
print(resource.get_mime_type())
desired_len = gstring.len
# gstring.str is missing data because it returns the data up to the first NULL byte
assert(gstring.str == desired_len) # this assertion fails
# calling this causes a segfault after the handler returns, but the data is accessible from gbytes.get_data()
#gbytes = gstring.free_to_bytes()
#assert(len(gbytes.get_data()) == desired_len) # this assertion succeeds before the segfault
return
webview = WebKit.WebView()
webview.connect('resource-load-finished', signal_resource_load_finished)
webview.connect('load-finished', Gtk.main_quit)
# lol cat for demo purposes of a resource containing NULL bytes (mime type: image/png)
webview.load_uri('http://images5.fanpop.com/image/photos/30600000/-Magical-Kitty-lol-cats-30656645-1280-800.png')
Gtk.main()
您不想使用它,free_to_bytes
因为它不仅会为您提供所需的字节,而且还会在Python不知道的情况下从内存中释放字符串-正如您所发现的那样,它会使程序崩溃。不幸的是,没有真正设计为保存二进制数据的相应get_bytes
方法GLib.String
。
实际上,我认为WebKit API中的一个错误是资源有效负载只能以形式使用GLib.String
。他们似乎已经更正了WebKit2中的此错误:http ://webkitgtk.org/reference/webkit2gtk/stable/WebKitWebResource.html
如果可以,请考虑切换到WebKit2 from gi.repository import WebKit2
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句