Python 3.x 在Python3中访问文档

Python 3.x 在Python3中访问文档,python-3.x,dom,gtk3,webkitgtk,Python 3.x,Dom,Gtk3,Webkitgtk,因此,我正在使用Oython/GTK+创建一个小程序,它的核心是一个显示一些HTML页面的WebView。现在,我希望允许用户通过高亮显示文本、下划线文本等操作视图。稍后,我希望我的程序将此标记存储在不同的文件中,以便稍后可以动态加载它 我可以简单地将WebView设置为可编辑,但是我必须保存一个更改过的HTML文档;我更希望保持原始文档不变,并单独保存用户标记 我的想法是使用DOM,尤其是DOMSelection和DOMRange函数。WebKit3.0api()声明 WebKitViewer

因此,我正在使用Oython/GTK+创建一个小程序,它的核心是一个显示一些HTML页面的WebView。现在,我希望允许用户通过高亮显示文本、下划线文本等操作视图。稍后,我希望我的程序将此标记存储在不同的文件中,以便稍后可以动态加载它

我可以简单地将WebView设置为可编辑,但是我必须保存一个更改过的HTML文档;我更希望保持原始文档不变,并单独保存用户标记

我的想法是使用DOM,尤其是DOMSelection和DOMRange函数。WebKit3.0api()声明

WebKitViewer.get_dom_document()
应返回一个WebKit.DOMDocument。但是,正如运行附加的MWE(如下)所示,此调用返回一个WebKit.DOMHTMLDocument。 使用这个对象,我找不到访问DOMDocument或DOMDOSelection的方法,我需要继续

我的问题:

问:这是一个已知的bug还是我使用了错误的调用

编辑1:

虽然我不确定上面提到的返回值是否正确,但我找到了一种解决问题的方法:

# The still strange return document
DOMHTMLdoc = editor.get_dom_document()
# The view that contains the doc
def_view = DOMHTMLdoc.get_default_view()
# On this view one can finally create a selection
sel = def_view.get_selection()
完(1)

如果有其他(更容易)的方法来实现这一点,我愿意听取建议;) 提前谢谢


设置:

Linux Antergos 4.9.11-1-ARCH x86_64

杰尼

Python3.6.0

gir1.0


MWE

import gi
import os

gi.require_version('Gtk', '3.0')
gi.require_version('WebKit', '3.0')
from gi.repository import Gtk, WebKit

w = Gtk.Window()
w.set_title("Example Editor")
w.set_default_size(800,400)
w.connect("destroy", Gtk.main_quit)

message = "<!DOCTYPE html><html><head><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><title>ERSTE SCHRITTE MIT BRACKETS</title><meta name=\"description\" content=\"Ein interaktiver Wegweiser für die ersten Schritte mit Brackets.\"><link rel=\"stylesheet\" href=\"main.css\"></head><body><h1>ERSTE SCHRITTE MIT BRACKETS</h1><h2>Dies ist Ihre Anleitung!</h2><p> Willkommen zu Brackets, einem modernen, quelloffenen Code-Editor, der Webdesign versteht. Es ist ein einfacher, aber dennoch leistungsfähiger Editor, der Ihnen immer die richtigen Tools einblendet, sodass Sie die genau richtige Menge an Hilfestellung haben, wann immer Sie diese brauchen.</p></body></html>"

editor = WebKit.WebView()
status = editor.get_load_status()
DOMHTMLdoc = editor.get_dom_document()

def load_up(self):
    editor.load_string(message,"text/html","utf-8","file://")

def show_status(self):
    # Give the WebView some time to load everything
    status = editor.get_load_status()
    if  status == 2:
        # Here I would expect a DOMDocument to be returned
        # but instead I get DOMHTMLDocument
        DOMHTMLdoc = editor.get_dom_document()
        el = DOMHTMLdoc.get_active_element()
        coll = el.get_children()
        length = coll.get_length()
        print("DOMHTMLdoc: ")
        print(DOMHTMLdoc)
        # Here I can loop over the elements, but always DOMHTMLxx
        print("DOMHTMLElement: ")
        print(el)
        for i in range(0, length):
            print(coll.item(i))

hb = Gtk.HBox()
vb = Gtk.VBox()
b = Gtk.Button("Load")
b.connect("clicked", load_up)
b2 = Gtk.Button("DOM status")
b2.connect("clicked", show_status)
swindow = Gtk.ScrolledWindow()
swindow.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
swindow.add(editor)
hb.add(b)
hb.add(b2)
vb.pack_start(hb, False, False, 0)
vb.add(swindow)

w.add(vb)
w.show_all()
Gtk.main()
导入gi
导入操作系统
gi.require_版本('Gtk','3.0')
gi.require_版本('WebKit','3.0')
从gi.repository导入Gtk、WebKit
w=Gtk.Window()
w、 设置标题(“示例编辑器”)
w、 设置默认大小(800400)
w、 连接(“销毁”,Gtk.main_退出)
消息=“这是我的错 Willkommen zu方括号,einem modernen,quelloffenen代码编辑器,网络设计VSTEHT。这是艾因菲舍尔,阿伯·丹尼诺赫·莱斯通斯福·希格的编辑,他是一位富有的工具工程师,他是一位富有的年轻人,他是一位伟大的作家。

” editor=WebKit.WebView() status=editor.get\u load\u status() DOMHTMLdoc=editor.get\u dom\u document() def加载(自): 编辑器。加载字符串(消息,“文本/html”、“utf-8”、“文件:/”) def显示_状态(自身): #给WebView一些时间来加载所有内容 status=editor.get\u load\u status() 如果状态==2: #在这里,我希望能够返回一个文档 #但我得到的是DOMHTMLDocument DOMHTMLdoc=editor.get\u dom\u document() el=DOMHTMLdoc.get\u active\u元素() coll=el.get_children() 长度=coll.get_length() 打印(“DOMHTMLdoc:”) 打印(DOMHTMLdoc) #在这里,我可以在元素上循环,但始终是DOMHTMLxx 打印(“DOMHTMLElement:”) 打印(el) 对于范围内的i(0,长度): 印刷品(列项目(i)) hb=Gtk.HBox() vb=Gtk.VBox() b=Gtk.按钮(“加载”) b、 连接(“单击”,加载) b2=Gtk.按钮(“DOM状态”) b2.连接(“单击”,显示状态) swindow=Gtk.ScrolledWindow() swindow.set_策略(Gtk.PolicyType.AUTOMATIC,Gtk.PolicyType.AUTOMATIC) 添加(编辑器) hb.添加(b) hb.add(b2) vb.pack_start(hb,False,False,0) vb.add(swindow) w、 添加(vb) w、 全部展示 Gtk.main()