bpo-31648: Improve ElementPath (#3835)

* Allow whitespace inside of ElementPath predicates.
* Add ElementPath predicate support for text comparison of the current node, like "[.='text']".
This commit is contained in:
scoder 2017-09-30 15:35:21 +02:00 committed by Serhiy Storchaka
parent 9811e80fd0
commit 101a5e84ac
5 changed files with 68 additions and 7 deletions

View file

@ -157,6 +157,9 @@ def prepare_predicate(next, token):
return
if token[0] == "]":
break
if token == ('', ''):
# ignore whitespace
continue
if token[0] and token[0][:1] in "'\"":
token = "'", token[0][1:-1]
signature.append(token[0] or "-")
@ -188,16 +191,22 @@ def prepare_predicate(next, token):
if elem.find(tag) is not None:
yield elem
return select
if signature == "-='" and not re.match(r"\-?\d+$", predicate[0]):
# [tag='value']
if signature == ".='" or (signature == "-='" and not re.match(r"\-?\d+$", predicate[0])):
# [.='value'] or [tag='value']
tag = predicate[0]
value = predicate[-1]
def select(context, result):
for elem in result:
for e in elem.findall(tag):
if "".join(e.itertext()) == value:
if tag:
def select(context, result):
for elem in result:
for e in elem.findall(tag):
if "".join(e.itertext()) == value:
yield elem
break
else:
def select(context, result):
for elem in result:
if "".join(elem.itertext()) == value:
yield elem
break
return select
if signature == "-" or signature == "-()" or signature == "-()-":
# [index] or [last()] or [last()-index]