strs = [f(x,self.attrs[x]) for x in self.attrs]
return " ".join(strs)
+ # basic acquision functions
def get_attribute(self, attr, default=None):
"""returns given attribute's value."""
return self.attrs.get(attr, default)
"""returns content in the tag."""
return self._text
+ def inner_html(self):
+ "returns inner html"
+ rn = HTMLRenderer()
+ return rn.render_inner(self)
+
+ # navigation functions
def parent(self):
"""returns tag's parent element."""
return self._parent
"""returns tag's previous element."""
return self._prev_elem
+ # basic query functions
def get_elements_by_name(self, name):
buf = []
self._r_get_elements_by_name(name, buf)
#raise HTMLElementError("Element not found")
return None
+ def get_elements_by_class(self, cls):
+ buf = []
+ self._r_get_elements_by_class(cls, buf)
+ return buf
+
+ def _r_get_elements_by_class(self, cls, buf):
+ if self.get_attribute("class") == cls:
+ buf.append(self)
+ for i in self:
+ i._r_get_elements_by_class(cls, buf)
+
+ # query functions
+ # TODO: this function is under implementing...
def select(self, expr):
terms = expr.strip().split()
if len(terms) == 0:
return []
+ results = self
+ # at first, select #id
+ ids = [x[1:] for x in terms if x[0] == "#"]
+ if len(ids) != 0:
+ results = [results.get_element_by_id(ids[-1]),]
+ # next, select .class
+ cs = [x[1:] for x in terms if x[0] == "."]
+ t = []
+ if len(cs) != 0:
+ for c in cs:
+ t.extend(results.get_elements_by_class(c))
+ results = t
+ return results
+
+ def select_1st(self, expr):
+ r = self.select(expr)
+ if len(r) == 0:
+ return None
+ else:
+ return r[0]
def select_by_name2(self, term1, term2):
tbl = self.get_elements_by_name(term1)
buf.extend(st)
return buf
+ # is_* functions
def is_text(self):
return self.type == HTMLElement.TEXT
p = p.parent()
return False
+ # mmmh....
def trace_back(self, tag):
""" regexp string => list"""
p = self.parent()
p = p.parent()
return result
- def inner_html(self):
- "returns inner html"
- rn = HTMLRenderer()
- return rn.render_inner(self)
class HTMLTreeError(Exception):
def __init__(self, msg, lineno, offset):