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

标签 python xml xpath abstract-syntax-tree

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

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

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

我知道,那里有很多工具,将语法解析为 XML 或 JSON 文件,并寻找类似可用于解析 JS 语法的东西。

最佳答案

你说得对,“丑陋的正则表达式”不能真正用于处理任意 JS(或任何其他与此相关的标准编程语言)。您需要一个成熟的解析器。

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

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

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

关于python - 将 JS 代码转换为 XML 编码的 AST 树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20377257/

相关文章:

python - Pandas - 填充 NaN 的变体 - 什么是优雅和 pythonic 的方式来做到这一点?

java - fragment 中的维基图像识别

xml - xpath concat函数将XML数据转换为文本

xml - 带条件的 xpath

python - 按数据框中的不同值划分列

python - 如何删除聚类图中的 x 和 y 轴标签?

保存在数据库中时的python datetime问题

c++ - 使用 TinyXML 解析 XML 文件 C++

java - hyperjaxb3 : Enumeration questions

sql-server - 当不支持 "following"轴时,在 XPath 中获取以下同级