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*)。在

代码质量和稳定性

代码还远未完成。 它已经过测试,但是有一些小问题(属性匹配不在后面 规格一字不差)。在

请随时为我做贡献。在

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java未能实例化[org.springframework.web.servlet.HandlerMapping]:工厂方法“resourceHandlerMapping”引发异常;没有ServletContext集   date Java 8–使用时区从LocalDateTime创建即时   带有BigInteger的Java hmacSHA256与C不同#   java线在未最大化时绘制在错误的位置   java错误:数据源拒绝建立连接,来自服务器的消息:“连接太多”   java Beanio:如何根据另一个字段值验证字段?   java SonarQube无法连接到>本地主机/0:0:0:0:0:0:0:1:9000   JavaLucene实现对相关性的自定义评分   排序java。lang.IllegalArgumentException:比较方法违反了它的通用合同java。base/java。util。蒂姆索特。合并崩溃   java处理来自另一个类的按钮按下   java未检测到短电源按钮按下   java需要在另一个具有RecyclerView的活动中使用复选框放置所选(多个)RecyclerView项行   java捆绑包的激活器无效