refactor(parser/find_by_text): Better implementation for ~20% speed boost
This commit is contained in:
+12
-19
@@ -907,32 +907,25 @@ class Adaptor(SelectorsGeneration):
|
|||||||
if not case_sensitive:
|
if not case_sensitive:
|
||||||
text = text.lower()
|
text = text.lower()
|
||||||
|
|
||||||
def _traverse(node: Adaptor) -> None:
|
# This selector gets all elements with text content
|
||||||
|
for node in self.__handle_elements(self._root.xpath('//*[normalize-space(text())]')):
|
||||||
"""Check if element matches given text otherwise, traverse the children tree and iterate"""
|
"""Check if element matches given text otherwise, traverse the children tree and iterate"""
|
||||||
node_text = node.text
|
node_text = node.text
|
||||||
# if there's already no text in this node, dodge it to save CPU cycles and time
|
if clean_match:
|
||||||
if node_text:
|
node_text = node_text.clean()
|
||||||
if clean_match:
|
|
||||||
node_text = node_text.clean()
|
|
||||||
|
|
||||||
if not case_sensitive:
|
if not case_sensitive:
|
||||||
node_text = node_text.lower()
|
node_text = node_text.lower()
|
||||||
|
|
||||||
if partial:
|
if partial:
|
||||||
if text in node_text:
|
if text in node_text:
|
||||||
results.append(node)
|
|
||||||
elif text == node_text:
|
|
||||||
results.append(node)
|
results.append(node)
|
||||||
|
elif text == node_text:
|
||||||
|
results.append(node)
|
||||||
|
|
||||||
if results and first_match:
|
if first_match and results:
|
||||||
# we got an element so we should stop
|
# we got an element so we should stop
|
||||||
return
|
break
|
||||||
|
|
||||||
for branch in node.children:
|
|
||||||
_traverse(branch)
|
|
||||||
|
|
||||||
# This will block until we traverse all children/branches
|
|
||||||
_traverse(self)
|
|
||||||
|
|
||||||
if first_match:
|
if first_match:
|
||||||
if results:
|
if results:
|
||||||
|
|||||||
Reference in New Issue
Block a user