我想为来自lxml的html树添加一些功能。
因此我想添加一个类,使用super().__init__()
并添加额外的功能,例如为每个节点添加深度,为isLeafNode
添加布尔值,以及实现view
方法
问题开始的地方,因为我可能会使用lxml.html.fromstring('<p>test</p>')
初始化lxml类。
这是我到目前为止所得到的:
class Elhanced(lxml.etree._ElementTree):
def __init__(self, htmlString):
super().__init__()
self.x = 'useful'
self.tree = lxml.html.fromstring(htmlString) # Issue
def useful_function():
pass
但是,我实际上希望对象是增强的
lxml对象具有附加功能,而不是可通过self.tree
访问的树,而其他属性可在self
访问。
如何将功能添加到增强的lxml对象?
我想像这样初始化:
el = Elhanced('<p>test</p>')
其中el
包含lxml
的所有方法(例如el.xpath
应该存在),以及el.useful_function()
和el.x
。
也许甚至还有一种更好的方法,我现在还没有看到。
答案 0 :(得分:2)
您只需使用继承 - 无需担心维护agregate self.tree
实例:您的子类只有原始超类的行为才能覆盖它。
唯一不直接的部分正是因为某些原因,lxml库旨在使您难以为其提供一个简单的字符串来解析(从而提供外部fromstring
工厂)。
如果使用类似文件的对象调用实例parse
方法,则可以进行解析 - 因此在调用parse
之前必须将普通字符串转换为该字符串。是的,它可以在__init__
内完成。试试吧:
import lxml.etree
# Python 2/3 compatibility
try:
from StringIO import StringIO
except ImportError:
from io import StringIO
class Elhanced(lxml.etree._ElementTree):
def __init__(self, htmlString):
super(Elhanced, self).__init__()
self.x = 'useful'
self.parse(StringIO(htmlString), lxml.etree.HTMLParser())
def useful_function():
pass