操作更方便的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 |
本项目仅供所有人学习交流使用, 禁止用于商业用途
Metadata
Release files for zxpath2 1.1.3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| zxpath2-1.1.3-py3-none-any.whl | Python 3 | none | any | Details |
Release files / zxpath2-1.1.3-py3-none-any.whl
| Download URL | zxpath2-1.1.3-py3-none-any.whl |
|---|---|
| Size | 22.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
7a0333f9832cd308db142f89c4a95cc82fdf423cdf86e75dd97720d229d950ee
|
|
BLAKE2b-256 checksum How to use checksums |
89c82e6bc33ba3b44edc10ef720534507fb330a535b7ffad3341cd445b05a438
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/1.12.1 pkginfo/1.5.0.1 requests/2.21.0 setuptools/39.0.1 requests-toolbelt/0.8.0 tqdm/4.29.0 CPython/3.6.7
|
Security for zxpath2 1.1.3
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.