Python中实现CSS解析器/替换器的惯用方法是什么?

10

我希望实现一个脚本,它可以读取CSS文件并对其进行有意义的更改(添加/删除/替换行/单词等)。基本逻辑是实现RTL(从右到左)转换。

我能想到很多方法:

  • 文件读取器-读取一行,分析它并对其进行必要的更改。
  • 两阶段扫描-创建内存模型,扫描和更改它,将模型保存为文本。
  • 正则表达式-可能会很困难,因为其中一些可能非常复杂。

我想知道这些或其他方法中,哪种方法是Python中推荐的方式?您认为我应该熟悉哪些相关库进行此类操作?

编辑: 值得注意的是,这是一种“通过可用项目学习Python”的项目,因此我不熟悉您在此处提到的大多数库。


http://nedbatchelder.com/text/python-parsers.html 包含了Python语言解析工具现状的优秀调查。我最好的(非分析性)猜测是CSS是一种上下文无关(不是正则)语言,因此只能通过有状态的解析器正确转换。 - msw
3
你尝试过在Python中使用现有的CSS解析器,比如cssutils吗? - jfs
您想保留格式、注释等内容吗? - Karoly Horvath
首先,可能需要提到这是一个“通过可用项目学习Python”的项目,所以我对你上面提到的大多数内容并不熟悉(我也会在主贴中添加这个备注)。通过查看cssutils页面和示例,它似乎属于我提到的第二种方法。我肯定会进一步了解它,但问题仍然存在,即在这种情况下,这是否实际上是最好的Python实践? - arikg
格式方面我比较灵活,目前并不是必须的要求。 - arikg
1个回答

21

如果你想要快速且简单的方法,有很多有趣的方式可以实现这一点。 (正如你所说:逐行处理、正则表达式等)

但是,如果你想要做得“正确”(对所有输入都正确),你需要一个基于官方CSS词法分析和语法的真正解析器。在Python中,有cssutilstinycss。(免责声明:我是tinycss的作者。)如果你想学习,我认为tinycss的源代码很直观易学 :)


非常希望能听到您对这两个解析器工具的区别的看法,或者以回答“既然已经有了CSSUtils,为什么还要创建TinyCSS?”的形式来表达。 - arikg
2
arikg:在这里:http://exyr.org/2012/tinycss-css-parser/ 简而言之,主要是因为cssutils不易于扩展新语法。 - Simon Sapin
我刚试着用tinycss做这件事,但是写回css文件似乎一点也不简单。我可以用一些手写代码编写规则,但是它会缺少所有注释和所有tinycss实际上不解析的东西,比如@media... - n13
3
是的,tinycss没有一个合适的序列化器。我建议使用https://github.com/SimonSapin/tinycss2代替,它具备此功能。 - Simon Sapin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接