【问题标题】:use python re lib parsing "user define xpath" scripts使用 python re lib 解析“用户定义 xpath”脚本
【发布时间】:2021-04-28 06:14:03
【问题描述】:

我正在为我的团队用 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 来解决它。

但是我发现这很困难,不知道如何开始。

有人可以帮忙吗?谢谢~

【问题讨论】:

  • 我认为您将不得不使用一个状态机来解析这个,该状态机跟踪( )[ ]" "' ' 的嵌套。没有简单的正则表达式可以做到这一点。
  • 是的,感谢关键字。它认为我应该开始研究像ANTLR这样的工具

标签: python regex parsing xpath python-re


【解决方案1】:

好的,我认为这可以满足您的要求。您应该尝试一些不同的测试字符串。

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']")

【讨论】:

  • 谢谢 但是在测试数据中,如果我使用 ast.literal_eval(sig) ,它将打印语法错误,因为 xpath 中的参数(如 //table[@id='123'])会导致问题。
  • 啊,看看你的数据,当然会。我要删除这个答案。
  • @Time Roberts 谢谢,这真的很酷,我会按照这个想法尝试自己:) 但是我发现输出似乎丢失了一个元素。
  • 啊,你是对的,如果它不是元组的一部分,它将被留下。我需要处理任何剩菜。我会解决的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多