【问题标题】:Parse Java Script in Python 3.6在 Python 3.6 中解析 Java 脚本
【发布时间】:2017-09-08 07:51:35
【问题描述】:

我想解析以下从 HTML 页面中抓取的 javascript:

  var ibmdebug = false; //indicates whether or not to display flash debug window
  if (qsParse.get("debug") == "true") {
    ibmdebug = true;
  }
  var matchStatsConfig = {
    courtId : "B",
    matchId : "5126",

matchStatus : "C"
,
    eventId : "MX",
    roundId : "1",
    dayMessage : "Day 5 Friday 7 July",
    relatedContentTags :  ['atpi200','wta316629','atpba79','wta316713'],
    team1 : {
      a : "atpi200",
      a_name : "D. Inglot",
      a_seed : "",
      b : "wta316629",
      b_name : "L. Robson",
      b_seed : ""
    },
    team2 : {
      a : "atpba79",
      a_name : "A. Begemann",
      a_seed : "",
      b : "wta316713",
      b_name : "N. Melichar",
      b_seed : ""
    }
  }

基于this thread,我使用包slimit如下,其中js.text包含javascript代码作为字符串:

data = js.text
parser = Parser()
tree = parser.parse(data)
fields = {getattr(node.left, 'value', ''): getattr(node.right, 'value', '')
for node in nodevisitor.visit(tree)
if isinstance(node, ast.Assign)}
print(fields)

fields 的输出/内容如下所示

{
    'ibmdebug': 'true',
    'courtId': '"B"',
    'matchId': '"5126"',
    'matchStatus': '"C"',
    'eventId': '"MX"',
    'roundId': '"1"',
    'dayMessage': '"Day 5 Friday 7 July"',
    'relatedContentTags': '',
    'team1': '',
    'a': '"atpba79"',
    'a_name': '"A. Begemann"',
    'a_seed': '""',
    'b': '"wta316713"',
    'b_name': '"N. Melichar"',
    'b_seed': '""',
    'team2': ''
}

如您所见,它没有被正确解析(只有部分正确)。数组 relatedContentTags 保持为空,team1team2 对象/字典也是如此。有趣的是,team2 变量的内容就在那里。我假设是这种情况,因为team1 的内容也被解析,但被team2 的内容覆盖。

我的问题是:如何正确地将初始 javascript 解析为 python 数据结构(例如字典)?

【问题讨论】:

    标签: javascript python parsing


    【解决方案1】:

    由于我的 javascript 代码没有对键使用引号,因此只能由 demjson 解析,如 herehere 所述。

    所以我的工作代码如下

    # get only the "matchStatsConfig" variable
    script = re.search(r'var matchStatsConfig = .*$', data, re.DOTALL).group()
    
    # convert it to json
    json = demjson.decode(script.replace('var matchStatsConfig =', '')) 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-24
      • 1970-01-01
      相关资源
      最近更新 更多