操作更方便的xpath
Project description
操作更方便的xpath
使用方法类似于Beautiful Soup4, 但是比他更快速, 功能更强大
import zxpath2
def find(name=None, class_=None, text=None, deep=True, index: None or int = 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对象的列表
'''
pass
zx = 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对象可以作为函数名直接调用find
Element对象属性
属性名 | 返回类型 | 描述 |
---|---|---|
name | str | 返回元素节点的标签名, 如 a, div, h1, p, span等 |
base | etree._Element对象 | 返回原始的etree._Element |
id | int | 返回base的id值 |
is_element | bool | 返回是否为一个element节点, 始终返回True |
is_node_element | bool | 返回是否为一个元素节点, 始终返回True |
is_text_element | bool | 返回是否为一个文本节点, 始终返回False |
is_comment | bool | 返回当前节点是否为注释节点 |
string | str | 返回当前节点下所有的文本连接在一起的字符串, 没有文本返回空字符串 |
text | str | 返回当前节点下的第一个文本, 没有文本返回空字符串 |
tail | str | 返回当前节点的尾巴文本, 没有文本返回空字符串 |
html | str | 将当前节点序列化为html源码 |
attrs | dict | 获取当前节点的所有属性 |
pre | 返回当前节点的之前的一个同级对象, 没有时返回None | |
pres | Element_List | 返回当前节点之前的所有同级对象, 没有时返回空列表 |
pre_node | 返回当前节点的之前的一个同级元素节点, 没有时返回None | |
pres_node | Element_List | 返回当前节点之前的所有同级元素节点, 没有时返回空列表 |
next | 返回当前节点的之后的一个同级对象, 没有时返回None | |
nexts | Element_List | 返回当前节点之后的所有同级对象, 没有时返回空列表 |
next_node | 返回当前节点的之后的一个同级元素节点, 没有时返回None | |
nexts_node | Element_List | 返回当前节点之后的所有同级元素节点, 没有时返回空列表 |
child | 返回当前节点的第一个子对象, 没有时返回None | |
childs | Element_List | 返回当前节点的所有子对象, 没有时返回空列表 |
child_node | 返回当前节点的第一个子元素节点, 没有时返回None | |
childs_node | Element_List | 返回当前节点的所有子元素节点, 没有时返回空列表 |
parent | Element | 返回当前节点的父节点, 没有时返回None |
ancestor | Element | 返回当前节点的第一个父辈, 没有时返回None |
ancestors | Element_List | 返回当前节点的所有父辈, 没有时返回空列表 |
Element.xpath方法
使用原生xpath代码查询
参数名 | 数据类型 | 默认值 | 描述 |
---|---|---|---|
code | str | 原生xpath代码, 如 //div/a, //div/h1/text() | |
index | None int |
None |
Element.css方法
使用原生css代码查询
参数名 | 数据类型 | 默认值 | 描述 |
---|---|---|---|
code | str | 原生css代码, 如 .class1, div>a | |
index | None int |
None |
Element.child_in方法
接收一个参数, 返回当前节点是否为传入对象的子节点
Element.remove_attr方法
从节点中删除当前节点的某一个属性, 无此属性则忽略
Element.remove_all_attr方法
删除当前节点的所有属性
Element.remove_self方法
从节点树中删除当前节点
Element.remove方法
接收一个参数, 从节点树中删除当前节点的一个子节点, 如果传入的对象不是当前节点的子节点会报错, 不能删除文本节点
Element.change_text方法
修改当前节点的主要文本
Element.change_tail方法
修改当前节点的尾巴文本
Element.find方法
查询当前节点下的对象
参数名 | 数据类型 | 默认值 | 描述 |
---|---|---|---|
name | str | None | 要查找的对象名, 表示html中的标签名, 如div,a,li, 如果设为None或空字符串表示查询所有对象 |
class_ | str | None | 要查找元素的类名 None: 不关心class True: 任何存在class属性的元素 False: 不存在class属性的元素 str: class属性为指定字符串的元素 |
text | str | None | 要查找对象的文本值 None: 不关心文本 True: 任何存在文本的元素 False: 没有文本的元素 str: 文本为指定字符串的元素 |
deep | bool | True | 是否深度查询 True: 遍历搜索当前节点下的所有对象 False: 只搜索当前节点下的子对象 |
index | int | None | |
其他属性名 | str | 你也可以选择使用html的其他属性名, 如href, src, style等 | |
带前下划线的属性名 | str | 如果属性名之前带了下划线, 如 _class_, _text, _href, _src等, 表示搜索的元素的这个属性不为设置的值 如 _text='123' 表示元素的文本不等于123, _src=True 表示元素没有src属性, 当然不推荐 _属性名=True这种方式, 你应该使用 属性名=False |
Element.其他查找方法
这些方法的属性参考find方法
方法名 | 描述 |
---|---|
find_pre | 查找当前节点之前的同级对象 |
find_pre_node | 查找当前节点之前的同级元素节点 |
find_next | 查找当前节点之后的同级对象 |
find_next_node | 查找当前节点之后的同级元素节点 |
find_child | 查找当前节点的子对象 |
find_child_node | 查找当前节点的子元素节点 |
Element高级使用方法
有一个html源码如下
<div>
<a id="a1" class="c1">1</a>
<a id="a2">2</a>
<a class="c1"></a>
<a class="c4">4</a>
<b id='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属性, 如果没有这个属性则返回None
node.class_ # 获取class属性
node['href'] # 获取href属性, 如果没有这个属性则报错
node['class'] # 获取class属性
node in zx # 判断两个对象是否指向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-05 | 1.1.3 | 紧急修复了一个bug, 如果html源码是紧凑型的, 参数method为html时获取源码会输出空的Dom树, 已将method参数改为xml |
19-06-05 | 1.1.2 | |
19-04-03 | 1.1.1 | |
19-03-19 | 1.1.0 | |
19-01-30 | 1.0.3 | |
19-01-21 | 1.0.2 | |
19-01-18 | 1.0.1 | 修复获取所有父辈节点时会报错的bug |
本项目仅供所有人学习交流使用, 禁止用于商业用途
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
No source distribution files available for this release.See tutorial on generating distribution archives.
Built Distribution
zxpath2-1.1.3-py3-none-any.whl
(22.6 kB
view hashes)