将JS代码转换为XML编码的AST树

时间:2013-12-04 13:56:50

标签: python xml xpath abstract-syntax-tree

当我编写scraper时,我总是使用优秀的XPath查询语言从HTML或XML中提取数据。

我经常使用动态HTML,并且需要从Javascript代码中提取一些变量,因此我不得不编写丑陋的正则表达式。

我正在寻找一些更好的方法来做到这一点,而不涉及像PhantomJS这样的重量级Javascript解释器。

我知道,许多工具在哪里,它将语法解析为XML或JSON文件,并寻找可用于解析JS语法的东西。

1 个答案:

答案 0 :(得分:2)

你是对的,“丑陋的正则表达式”不能真正用于处理任意JS(或任何其他标准编程语言)。你需要一个完整的解析器。

没有“很多工具”可以解析(语言)语法到XML。大多数真正的语言工具都有解析器,它构建了一个内部AST数据结构,用于高效访问,然后该工具用于实现其目的(分析,转换,执行)。你说“翻译成它的树”就像那棵树是唯一的一样;事实并非如此。构建的AST是解析技术,使用的语法以及设计者认为访问的重要因素的函数,因此没有两种语言工具能够同意AST的外观。树形状因此取决于工具。

如果您掌握了任何此类工具的源代码,您可以丢弃其解析后的机制,并添加代码以遍历AST并转储XML;这并不是特别难(尽管获得所有输出字符转义/编码权利是皇家PITA)。当然,您获得的XML将根据原始工具AST进行整形。这意味着您构建的用于处理XML的任何工具都必须隐式理解您开始使用的特定工具解析器的形状。

我碰巧构建了通用程序转换机制(参见bio),它具有包括JavaScript在内的多种语言的解析器。我们得到了“我希望我有XML”的要求,因此我们的特定工具将通过命令行开关的翻转生成XML,完全使用上述方法。这是指向SO question showing the XML output for Javaone for C++的链接。如果你想看一个用于JavaScript的程序,我可以制作它并附加在这里只需要一点努力。