Merge branch 'morfo'
This commit is contained in:
@@ -389,94 +389,12 @@ class FachoXML:
|
||||
|
||||
def get_element(self, xpath, multiple=False):
|
||||
xpath = self.fragment_prefix + self._path_xpath_for(xpath)
|
||||
return self.builder.xpath(self.root, xpath, multiple=multiple)
|
||||
|
||||
def get_element_text(self, xpath, format_=str, multiple=False):
|
||||
xpath = self.fragment_prefix + self._path_xpath_for(xpath)
|
||||
# MACHETE(bit4bit) al usar ./ queda ../
|
||||
xpath = re.sub(r'^\.\.+', '.', xpath)
|
||||
|
||||
elem = self.builder.xpath(self.root, xpath, multiple=multiple)
|
||||
if multiple:
|
||||
vals = []
|
||||
for e in elem:
|
||||
text = self.builder.get_text(e)
|
||||
if text is not None:
|
||||
vals.append(format_(text))
|
||||
return vals
|
||||
else:
|
||||
text = self.builder.get_text(elem)
|
||||
if text is None:
|
||||
return None
|
||||
return format_(text)
|
||||
|
||||
def get_element_text_or_attribute(
|
||||
self, xpath, default=None, multiple=False, raise_on_fail=False):
|
||||
parts = xpath.split('/')
|
||||
is_attribute = parts[-1].startswith('@')
|
||||
if is_attribute:
|
||||
attribute_name = parts.pop(-1).lstrip('@')
|
||||
element_path = "/".join(parts)
|
||||
try:
|
||||
val = self.get_element_attribute(
|
||||
element_path, attribute_name, multiple=multiple)
|
||||
if val is None:
|
||||
return default
|
||||
return val
|
||||
except KeyError as e:
|
||||
if raise_on_fail:
|
||||
raise e
|
||||
return default
|
||||
except ValueError as e:
|
||||
if raise_on_fail:
|
||||
raise e
|
||||
return default
|
||||
else:
|
||||
try:
|
||||
val = self.get_element_text(xpath, multiple=multiple)
|
||||
if val is None:
|
||||
return default
|
||||
return val
|
||||
except ValueError as e:
|
||||
if raise_on_fail:
|
||||
raise e
|
||||
return default
|
||||
|
||||
def get_elements_text_or_attributes(self, xpaths, raise_on_fail=True):
|
||||
"""
|
||||
returna el contenido o attributos de un conjunto de XPATHS
|
||||
si algun XPATH es una tupla se retorna el primer elemento del mismo.
|
||||
"""
|
||||
vals = []
|
||||
for xpath in xpaths:
|
||||
if isinstance(xpath, tuple):
|
||||
val = xpath[0]
|
||||
else:
|
||||
val = self.get_element_text_or_attribute(
|
||||
xpath, raise_on_fail=raise_on_fail)
|
||||
vals.append(val)
|
||||
return vals
|
||||
|
||||
def exist_element(self, xpath):
|
||||
elem = self.get_element(xpath)
|
||||
|
||||
# no se encontro elemento
|
||||
elem = self.builder.xpath(self.root, xpath)
|
||||
if elem is None:
|
||||
return False
|
||||
raise AttributeError('xpath %s invalid' % (xpath))
|
||||
|
||||
# el placeholder no ha sido populado
|
||||
if elem.get('facho_placeholder') == 'True':
|
||||
return False
|
||||
|
||||
# el valor opcional no ha sido populado
|
||||
if elem.get('facho_optional') == 'True':
|
||||
return False
|
||||
|
||||
return True
|
||||
|
||||
def _remove_facho_attributes(self, elem):
|
||||
self.builder.remove_attributes(
|
||||
elem, ['facho_optional', 'facho_placeholder'])
|
||||
text = self.builder.get_text(elem)
|
||||
return str(text)
|
||||
|
||||
def tostring(self, **kw):
|
||||
return self.builder.tostring(self.root, **kw)
|
||||
|
||||
Reference in New Issue
Block a user