Package: zxpath2
操作更方便的xpath使用方法类似于Beautiful Soup4, 但是比他更快速, 功能更强大importzxpath2deffind(name=None,class_=None,text=None,deep=True,index:Noneorint=None,**attrs):'''查询节点:param name: 元素名, 如果不是str类型则查找所有元素:param class_: class属性:param text: 文本值:param deep: 是否深度查询孙节点:param index: 取出第几个结果:param attrs: 匹配元素的属性值, 属性值为True, 表示存在该属性的元素, 属性名前加下划线_表示否定, 如_id=True表示不存在id的元素, _id='t1'表示id不是t1的元素:return: index为整数时: 成功返回Element对象, 失败返回None, index为其他:返回包含_Element对象的列表'''passzx=zxpath2.load('etree对象或者html源码')#加载zx.find('div',id='content')#查询id为'content'的所有div, 返回包含_Element对象的列表zx.find('div',id=False,index=0)#查询不存在id的第一个div, 返回_Element对象zx.find('div',_id='content',deep=False)#在当前节点中查询id不为'content'的所有div, 返回包含_Element对象的列表zx.find('div',id='content',index=-1)#查询id为'content'的最后一个div, 返回_Element对象zx('div',id='content')#_Element对象可以作为函数名直接调用findElement对象属性属性名返回类型描述namestr返回元素节点的标签名, 如 a, div, h1, p, span等baseetree._Element对象返回原始的etree._Elementidint返回base的id值is_elementbool返回是否为一个element节点, 始终返回Trueis_node_elementbool返回是否为一个元素节点, 始终返回Trueis_text_elementbool返回是否为一个文本节点, 始终返回Falseis_commentbool返回当前节点是否为注释节点stringstr返回当前节点下所有的文本连接在一起的字符串, 没有文本返回空字符串textstr返回当前节点下的第一个文本, 没有文本返回空字符串tailstr返回当前节点的尾巴文本, 没有文本返回空字符串htmlstr将当前节点序列化为html源码attrsdict获取当前节点的所有属性pre返回当前节点的之前的一个同级对象, 没有时返回NonepresElement_List返回当前节点之前的所有同级对象, 没有时返回空列表pre_node返回当前节点的之前的一个同级元素节点, 没有时返回Nonepres_nodeElement_List返回当前节点之前的所有同级元素节点, 没有时返回空列表next返回当前节点的之后的一个同级对象, 没有时返回NonenextsElement_List返回当前节点之后的所有同级对象, 没有时返回空列表next_node返回当前节点的之后的一个同级元素节点, 没有时返回Nonenexts_nodeElement_List返回当前节点之后的所有同级元素节点, 没有时返回空列表child返回当前节点的第一个子对象, 没有时返回NonechildsElement_List返回当前节点的所有子对象, 没有时返回空列表child_node返回当前节点的第一个子元素节点, 没有时返回Nonechilds_nodeElement_List返回当前节点的所有子元素节点, 没有时返回空列表parentElement返回当前节点的父节点, 没有时返回NoneancestorElement返回当前节点的第一个父辈, 没有时返回NoneancestorsElement_List返回当前节点的所有父辈, 没有时返回空列表Element.xpath方法使用原生xpath代码查询参数名数据类型默认值描述codestr原生xpath代码, 如 //div/a,  //div/h1/text()indexNoneintNoneNone: 返回一个列表, 包含所有符合条件的节点int: 返回指定位置(从0开始)的一个节点, 索引是安全的, 不存在的索引返回NoneElement.css方法使用原生css代码查询参数名数据类型默认值描述codestr原生css代码, 如 .class1,  div>aindexNoneintNoneNone: 返回一个列表, 包含所有符合条件的节点int: 返回指定位置(从0开始)的一个节点, 索引是安全的, 不存在的索引返回NoneElement.child_in方法接收一个参数, 返回当前节点是否为传入对象的子节点Element.remove_attr方法从节点中删除当前节点的某一个属性, 无此属性则忽略Element.remove_all_attr方法删除当前节点的所有属性Element.remove_self方法从节点树中删除当前节点Element.remove方法接收一个参数, 从节点树中删除当前节点的一个子节点, 如果传入的对象不是当前节点的子节点会报错, 不能删除文本节点Element.change_text方法修改当前节点的主要文本Element.change_tail方法修改当前节点的尾巴文本Element.find方法查询当前节点下的对象参数名数据类型默认值描述namestrNone要查找的对象名, 表示html中的标签名, 如div,a,li, 如果设为None或空字符串表示查询所有对象class_strNone要查找元素的类名None: 不关心classTrue: 任何存在class属性的元素False: 不存在class属性的元素str: class属性为指定字符串的元素textstrNone要查找对象的文本值None: 不关心文本True: 任何存在文本的元素False: 没有文本的元素str: 文本为指定字符串的元素deepboolTrue是否深度查询True: 遍历搜索当前节点下的所有对象False: 只搜索当前节点下的子对象indexintNoneNone: 返回一个列表, 包含所有符合条件的节点int: 返回指定位置(从0开始)的一个节点其他属性名str你也可以选择使用html的其他属性名, 如href, src, style等带前下划线的属性名str如果属性名之前带了下划线, 如 _class_, _text, _href, _src等, 表示搜索的元素的这个属性不为设置的值如 _text='123' 表示元素的文本不等于123, _src=True 表示元素没有src属性, 当然不推荐 _属性名=True这种方式, 你应该使用 属性名=FalseElement.其他查找方法这些方法的属性参考find方法方法名描述find_pre查找当前节点之前的同级对象find_pre_node查找当前节点之前的同级元素节点find_next查找当前节点之后的同级对象find_next_node查找当前节点之后的同级元素节点find_child查找当前节点的子对象find_child_node查找当前节点的子元素节点Element高级使用方法有一个html源码如下<div><aid="a1"class="c1">1</a><aid="a2">2</a><aclass="c1"></a><aclass="c4">4</a><bid='b5'class="c1">bbb</b></div>你可以使用如下代码查询zx=zxpath2.load('html源码')#加载html源码或一个经过lxml.etree编译的对象zx('div')# 直接将对象作为方法使用, 参数参考find方法zx.div# 遍历搜索当前节点中的第一个div元素node=zx.div.span.a# 链式查询第一个div中的第一个span中的第一个a元素node.href# 获取当前节点的href属性, 如果没有这个属性则返回Nonenode.class_# 获取class属性node['href']# 获取href属性, 如果没有这个属性则报错node['class']# 获取class属性nodeinzx# 判断两个对象是否指向Dom树中的同一个位置 或 node是否为zx的子孙节点node==zx# 判断两个对象是否指向Dom树中的同一个位置zx.find('a',id=True)# 查找存在id的a元素zx.find('a',id=False)# 查找不存在id的a元素zx.find(class_='c1')# 查找class为c1的任何元素zx.find('a',_class='c1',text=True)#查找class不为c1并且存在文本的a元素更新日志发布时间版本发布说明19-06-051.1.3紧急修复了一个bug, 如果html源码是紧凑型的, 参数method为html时获取源码会输出空的Dom树, 已将method参数改为xml19-06-051.1.2新增方法get_tail()用于获取节点的尾巴文本, 也可以使用tail属性获取remove_all_attr()用于删除当前对象的所有属性优化了节点类型判断方法,etree._ElementStringResult也被视为文本节点现在获取html源码允许用户设置输出格式, 默认为html. 允许用户选择是否输出尾巴文本, 默认不输出新增change_text(text: str)用于修改节点的主要文本新增change_tail(text: str)用于修改节点的尾巴文本19-04-031.1.1新增方法css(code, index: None or int = None), 现在可以使用css代码选择对象了新增方法remove_attr(key: str)用于删除当前对象的某个属性19-03-191.1.0取消__init__.py中的from . import xxx将下划线开始的模块名去掉下划线将所有搜索接口中的index重构, 不再将index解析为值传到原生xpath代码中, 仅作为字面意思从列表中提取第几个结果19-01-301.0.3现在_Element_List的str结果也被重载了现在可以用==判断两个_Element或列表是否相等修复了获取元素节点html时会将元素节点后面的文字也放入html的bug19-01-211.0.2重载了str()的结果现在可以用child_in判断是否为另一个_Element的子孙了可以使用in来判断一个_Element对象是否为另一个的子孙或和另个一对象相等19-01-181.0.1修复获取所有父辈节点时会报错的bug本项目仅供所有人学习交流使用, 禁止用于商业用途