python minidom和兼容DOM实现的CSS选择器语法
dom-quer的Python项目详细描述
python minidom和DOM实现的CSS选择器语法。在
简短的例子
提供了一个HTML文件示例.html以下代码将查询 一些元素并将它们返回为minidomelements。 对于多个元素(select_all)的情况,一个简单的python list 返回(而不是minidomNodeList)。在
fromxml.dom.minidomimportparsefromdom_queryimportselect,select_alltree=parse("test/html/sample.html")# Title elementtitle=select(tree,"title")# Every P elementparagraphs=select_all(tree,"p")# Element with type P and ID equal to "summary"summary=select(tree,"p#summary")# Every element with class "wide"wide_elements=select_all(tree,".wide")
支持的CSS语法
仅支持CSS语法的一个子集:
- 复合选择器(逗号分隔符)
- 元素类型和id
- 上课时间
- 属性匹配(存在和所有其他运算符)
- 组合子(后代,兄弟,后继,子)。在
一些支持的选择器:
^{pr2}$内部结构和实施
每个查询都被编译和缓存以供后续使用。在
Lexer
第一个阶段是标记化(^{em1})$列克谢.pylexer),这是松散的 基于 W3C selector lexer。 区别主要是为了使标记器与 正则表达式和去掉所有不必要的特征。在
解析器
然后进入解析阶段(分析器.pyparse)生成一个 令牌中的简单AST。解析器就像标记器一样,是一个 标准版的简化版。它是一个单一的功能 实现下降分析器。AST是元组和映射的元组 相对接近给定查询的方式。在
编译器
最后一个阶段是编译器(^{em1})$编译器.py编译)。它翻译过来了 将AST转换成一系列简单的操作,以便 选择匹配的元素。 一旦编译,它就保存在缓存中,并将在任何时候重复使用 再次看到查询。在
虚拟机
{em1由^代码执行$虚拟机.py执行)。此函数需要 起始元素、一系列操作码和一个api。 api是dict类的对象。每个键对应一个函数 实现操作码。默认api是minidom_api.py文件api。在
DOM API
api中的每个函数要么是一个过滤器(节点的实际过滤) 或者一个生成器(组合子展开)。只有两个操作码没有 遵循此规则的是YIELD(到目前为止找到的返回元素)和RESET (在CSS逗号后重新加载原始元素节点)。在
在其他dom实现的情况下,应该足够 编写一个新的api并在查询时将其传递给execute(或select*)。在
代码质量和稳定性
代码还远未完成。 它已经过测试,但是有一些小问题(属性匹配不在后面 规格一字不差)。在
请随时为我做贡献。在
- 项目
标签: