使用 python 重新库解析 "user define xpath" 脚本
use python re lib parsing "user define xpath" scripts
我正在 Python 为我的团队构建一个“xpath 解析工具”。
在我的例子中,xpath 脚本不是普通的 xpath,用户输入的语法将在一个特殊的结构中,这里是一个例子:
输入格式如下:(元素可以是元组类型或普通元素)
sig = "(xpath_1_1, xpath_1_2), (xpath_2_1, xpath_2_2), xpath_3..."
由用户excel编辑
而我的目标是将字符串解析成带有元组或普通元素的列表类型数据:
[(xpath_1_1, xpath_1_2), (xpath_2_1, xpath_2_2), xpath_3...]
然后我可以将这些数据输入到我的 selenium 中以顺序快照 img。
这是我的一个测试数据:
sig = "(//div[@style='font-family:Arial;float: left;width:930px;font-size:12px;' and ./span[contains(text(),'005930')]], //table[@id='gv_flow_krKS0 1']),//table[@id='123456'],(//div[@style='font-family:Arial;float: left;width:930px;font-size:12px;' and ./span[contains(text(),'000660')]], //table[@id='gv_flow_krKS0 2']),//table[@id='456789']"
我想知道有没有更好的方法可以在不破坏列表顺序的情况下实现这个功能?
首先,我认为 eval() func 不是一个好主意,因为它可能会导致一些安全问题。
现在想用re lib来解决
但是我发现这很难,不知道如何开始。
有人可以帮忙吗?谢谢~
好的,我认为这符合您的要求。您应该尝试一些不同的测试字符串。
sig = "(//div[@style='font-family:Arial;float: left;width:930px;font-size:12px;' and ./span[contains(text(),'005930')]], //table[@id='gv_flow_krKS0 1']),//table[@id='123456'],(//div[@style='font-family:Arial;float: left;width:930px;font-size:12px;' and ./span[contains(text(),'000660')]], //table[@id='gv_flow_krKS0 2']),//table[@id='456789']"
gather = ''
element = []
elements = []
state = ''
for c in sig:
if state:
gather += c
if c == state:
state = ''
continue
if c == '(':
in_tuple = True
continue
elif c == ')':
in_tuple = False
element.append( gather )
gather = ''
elements.append(tuple(element))
element = []
continue
elif c == ',':
if in_tuple:
element.append( gather )
else:
elements.append( gather )
gather = ''
continue
elif c == '[':
state = ']'
elif c == "'":
state = "'"
gather += c
# Handle leftover.
if element:
elements.append( element )
for e in elements:
print( e )
输出:
("//div[@style='font-family:Arial;float: left;width:930px;font-size:12px;' and ./span[contains(text(),'005930')]]", " //table[@id='gv_flow_krKS0 1']")
//table[@id='123456']
("//div[@style='font-family:Arial;float: left;width:930px;font-size:12px;' and ./span[contains(text(),'000660')]]", " //table[@id='gv_flow_krKS0 2']")
我正在 Python 为我的团队构建一个“xpath 解析工具”。 在我的例子中,xpath 脚本不是普通的 xpath,用户输入的语法将在一个特殊的结构中,这里是一个例子:
输入格式如下:(元素可以是元组类型或普通元素)
sig = "(xpath_1_1, xpath_1_2), (xpath_2_1, xpath_2_2), xpath_3..."
由用户excel编辑
而我的目标是将字符串解析成带有元组或普通元素的列表类型数据:
[(xpath_1_1, xpath_1_2), (xpath_2_1, xpath_2_2), xpath_3...]
然后我可以将这些数据输入到我的 selenium 中以顺序快照 img。
这是我的一个测试数据:
sig = "(//div[@style='font-family:Arial;float: left;width:930px;font-size:12px;' and ./span[contains(text(),'005930')]], //table[@id='gv_flow_krKS0 1']),//table[@id='123456'],(//div[@style='font-family:Arial;float: left;width:930px;font-size:12px;' and ./span[contains(text(),'000660')]], //table[@id='gv_flow_krKS0 2']),//table[@id='456789']"
我想知道有没有更好的方法可以在不破坏列表顺序的情况下实现这个功能?
首先,我认为 eval() func 不是一个好主意,因为它可能会导致一些安全问题。
现在想用re lib来解决
但是我发现这很难,不知道如何开始。
有人可以帮忙吗?谢谢~
好的,我认为这符合您的要求。您应该尝试一些不同的测试字符串。
sig = "(//div[@style='font-family:Arial;float: left;width:930px;font-size:12px;' and ./span[contains(text(),'005930')]], //table[@id='gv_flow_krKS0 1']),//table[@id='123456'],(//div[@style='font-family:Arial;float: left;width:930px;font-size:12px;' and ./span[contains(text(),'000660')]], //table[@id='gv_flow_krKS0 2']),//table[@id='456789']"
gather = ''
element = []
elements = []
state = ''
for c in sig:
if state:
gather += c
if c == state:
state = ''
continue
if c == '(':
in_tuple = True
continue
elif c == ')':
in_tuple = False
element.append( gather )
gather = ''
elements.append(tuple(element))
element = []
continue
elif c == ',':
if in_tuple:
element.append( gather )
else:
elements.append( gather )
gather = ''
continue
elif c == '[':
state = ']'
elif c == "'":
state = "'"
gather += c
# Handle leftover.
if element:
elements.append( element )
for e in elements:
print( e )
输出:
("//div[@style='font-family:Arial;float: left;width:930px;font-size:12px;' and ./span[contains(text(),'005930')]]", " //table[@id='gv_flow_krKS0 1']")
//table[@id='123456']
("//div[@style='font-family:Arial;float: left;width:930px;font-size:12px;' and ./span[contains(text(),'000660')]]", " //table[@id='gv_flow_krKS0 2']")