如何解析未知字符串格式 (可能是soup?)

88 阅读2分钟
  • 有时候从网站的 API 查询返回的数据格式是未知的,例如像下面这样的格式:
  • (DetailResult)
    {
    

huake_00257_.jpg status = (Status){ message = None code = "0" }

searchArgument = (DetailSearchArgument){ reqPartNumber = "BQ" reqMfg = "T" reqCpn = None }

detailsDto[] = (DetailsDto){

summaryDto = (SummaryDto){ PartNumber = "BQ" seMfg = "T" description = "Fast" }

packageDto[] = (PackageDto){ fetName = "a" fetValue = "b" }, (PackageDto){ fetName = "c" fetValue = "d" }, (PackageDto){ fetName = "d" fetValue = "z" }, (PackageDto){ fetName = "f" fetValue = "Sq" }, (PackageDto){ fetName = "g" fetValue = "p" },

additionalDetailsDto = (AdditionalDetailsDto){ cr = None pOptions = None inv = None pcns = None }

partImageDto = None

riskDto = (RiskDto){ life= "Low" lStage = "Mature" yteol = "10" Date = "2023"}

partOptionsDto[] = (ReplacementDto){ partNumber = "BQ2" manufacturer = "T" type = "Reel" },

inventoryDto[] = (InventoryDto){ distributor = "V" quantity = "88" buyNowLink = "https://www..." }, (InventoryDto){ distributor = "R" quantity = "7" buyNowLink = "http://www.r." }, (InventoryDto){ distributor = "RS" quantity = "2" buyNowLink = "www.rs.." }, },

}

- 如何解析这种格式的数据,并且如果它是某种流行的格式,是否有一些现成的解析器可以简化解析过程。

2. **解决方案:**

- 这种格式可能是一种嵌套的 repr 输出,类似于 JSON,但没有结构或对象名称信息。可以使用 pyparsing 库来解析这种格式。

- pyparsing 是一个用于解析结构化文本的 Python 库,它具有灵活而强大的语法定义机制。

- 下面是一个使用 pyparsing 库解析这种格式的示例代码:

from pyparsing import *

标点符号

LPAR,RPAR,LBRACE,RBRACE,LBRACK,RBRACK,COMMA,EQ = map(Suppress,"(){}[],=")

标识符

identifier = Word(alphas,alphanums+"_")

定义一些可以转换为 Python 类型的类型

(解析操作将在解析时执行转换)

NONE = Keyword("None").setParseAction(replaceWith(None)) integer = Word(nums).setParseAction(lambda t:int(t[0])) quotedString.setParseAction(removeQuotes)

定义嵌套对象定义的占位符 (由于 objDefn 将在其自己的定义中引用)

objDefn = Forward()

对象类型

objType = Combine(LPAR + identifier + RPAR)

对象值

objval = quotedString | NONE | integer | Group(objDefn)

对象属性

objattr = Group(identifier + EQ + objval)

数组属性

arrayattr = Group(identifier + LBRACK + RBRACK + EQ + Group(OneOrMore(Group(objDefn)+COMMA)) )

使用 '<<' 运算符将内容分配给先前声明的 Forward

objDefn << objType + LBRACE + ZeroOrMore((arrayattr | objattr) + Optional(COMMA)) + RBRACE

解析示例文本

result = objDefn.parseString(sample)

使用 pprint 列出缩进的解析数据

import pprint pprint.pprint(result.asList())

运行此代码可以将示例文本解析为一个嵌套的 Python 数据结构,可以通过 pprint.pprint 函数打印出来。

- 除了使用 pyparsing 库,还有一些其他的方法可以解析这种格式的数据,例如使用正则表达式或使用专门的解析器库。

- 具体使用哪种方法取决于数据的具体格式和解析的需求。