[TOC]
## PyQuery库的介绍
作为一个略懂JQuery的我,在众多的HTML解析库中,我只选择PyQuery库,因为它的元素定位与JQuery几乎完全相同,懂得了JQuery后,不需再去学习一些奇奇怪怪的语法了。
用JQuery的元素定位方式,既强大又灵活。
>[info] pyquery: a jquery-like library for python
官网地址:[http://pyquery.readthedocs.io/en/latest/](http://pyquery.readthedocs.io/en/latest/)
## 安装PyQuery
```cmd
pip install pyquery
```
## PyQuery 初始化
初始化的时候一般有三种传入方式:传入字符串,传入url,传入文件
举个简单例子如
```python
from pyquery import PyQuery as pq
d1 = pq("<html></html>")
d2 = pq(url="https://www.kancloud.cn/@guanfuchang")
d3 = pq(filename="report.html")
print(type(d1))
```
打印初始化d1的类型
```cmd
<class 'pyquery.pyquery.PyQuery'>
```
可知,这里的d1是一个pyquery对象。
## PyQuery 元素定位
```cmd
>>> from pyquery import PyQuery as pq
```
### 根据class定位
获取用户昵称
![](https://box.kancloud.cn/4e5d94a88b310c7fd9d23e1d74bd5d02_1177x248.jpg)
```cmd
>>> d = pq(url="https://www.kancloud.cn/@guanfuchang")
>>> d('.ui.header.center.aligned').text()
'Milton'
>>> d('.aligned').text()
'Milton'
```
### 根据id定位
获取用户昵称
![](https://box.kancloud.cn/1a116d1df389907f2b12145d3d54d49c_1324x158.jpg)
```cmd
>>> d=pq(url="http://www.cnblogs.com/guanfuchang")
>>> d('#Header1_HeaderTitle').text()
'鲨鱼逛大街'
```
### 根据标签定位
获取用户头像链接
![](https://box.kancloud.cn/44cb0ab30c4148be01f938b9240bf683_1130x222.jpg)
```cmd
>>> d=pq(url="https://www.kancloud.cn/@guanfuchang")
>>>
>>> d('.ui.container img').attr('src')
'https://avatar.kancloud.cn/05/97f2c4fac2554876aa49a68fc931b4!large'
>>>
```
### 根据属性定位
根据a标签的链接属性获取标题
![](https://box.kancloud.cn/bfeab6d53902fd17e39f9ff3387504b6_1057x244.jpg)
```cmd
>>> d=pq(url="https://www.kancloud.cn/@guanfuchang")
>>> d('a[href="/@guanfuchang?tab=attention"]').text()
'关注'
>>>
```
### 根据多层级结合定位
获取第一本书的标题
![](https://box.kancloud.cn/04ddd1bbe219fef0be13b342fb7b6e4b_1351x437.jpg)
```cmd
>>> d=pq(url="https://www.kancloud.cn/@guanfuchang")
>>> d('.items .header').text()
'轻松掌握接口测试_工具篇 python 快速入门'
>>>
>>> d('.items .header:first').text()
'轻松掌握接口测试_工具篇 python 快速入门'
>>>
```
如果要获取第二本书的标题,要如何处理?
```cmd
>>> d('.items .header').eq(1).text()
'python 快速入门'
```
更多定位方法,可以参照jquery的选择器
参考文档 [http://www.w3school.com.cn/jquery/jquery_ref_selectors.asp](http://www.w3school.com.cn/jquery/jquery_ref_selectors.asp)
## PyQuery 对象的属性与方法
>[warning] 重复强调 **最好的学习文档是源代码**,请认真阅读PyQuery的源码,通过源码才是快速掌握一个库的正确姿势。
* items(self, selector=None): 迭代元素,返回PyQuery对象
```cmd
>>> d = PyQuery('<div><span>foo</span><span>bar</span></div>')
>>>
>>> d('span')
[<span>, <span>]
>>>
>>> type(d('span'))
<class 'pyquery.pyquery.PyQuery'>
>>>
>>> type(d('span').items())
<class 'generator'>
>>>
>>> [i.text() for i in d('span').items()]
['foo', 'bar']
>>>
>>> [i.text() for i in d.items('span')]
['foo', 'bar']
```
* html(self, value=no_default, \**kwargs): 获取或设置子节点的HTML源码
```cmd
>>> d = PyQuery('<div><span>foo</span><span>bar</span></div>')
>>>
>>> d.html()
'<span>foo</span><span>bar</span>'
```
* text(self, value=no_default): 获取或设置子节点的文本内容
```cmd
>>> d = PyQuery('<div><span>foo</span><span>bar</span></div>')
>>>
>>> d.text()
'foo bar'
>>>
```
* prev(self, selector=None): 获取同级节点中的前一个节点
* next(self, selector=None): 获取同级节点中的后一个节点
```cmd
>>> d = PyQuery('<div class="zero"><span class="first">foo</span><span class="two">bar</span></div>')
>>>
>>> d('.two').prev()
[<span.first>]
>>>
>>> d('.first').prev()
[]
>>> d('.first').next()
[<span.two>]
```
* siblings(self, selector=None): 获取同级节点的所有兄弟节点或指定兄弟节点
```cmd
>>> d = PyQuery('<div class="zero"><span class="first">foo</span><span class="two">bar</span><img src=""/></div>')
>>>
>>> d('.two').siblings()
[<span.first>, <img>]
>>>
>>> d('.two').siblings('img')
[<img>]
```
* parents(self, selector=None):获取当前节点的所有祖先节点
* parent(): 获取当前节点的父节点
```cmd
>>> d = PyQuery('<div class="root"><div class="zero"><span class="first">foo</span><span class="two">bar</span><img src=""/></div></div>')
>>>
>>> d('.two').parents()
[<div.root>, <div.zero>]
>>>
>>> d('.two').parent()
[<div.zero>]
```
* children(self, selector=None): 获取所有子节点或指定的子节点
```cmd
>>> d = PyQuery('<div class="root"><div class="zero"><span class="first">foo</span><span class="two">bar</span><img src=""/></div></div>')
>>>
>>> d('.zero').children()
[<span.first>, <span.two>, <img>]
>>>
>>> d('.zero').children('.two')
[<span.two>]
```
* find(self, selector): 在当前节点的子节点中寻找指定节点
```cmd
>>> d = PyQuery('<div class="root"><div class="zero"><span class="first">foo</span><span class="two">bar</span><img src=""/></div></div>')
>>>
>>> d.find('span')
[<span.first>, <span.two>]
>>>
>>> d.find('.zero').find('.two')
[<span.two>]
```
* filter(self, selector): 在当前节点集之中过滤出符合条件的节点
```cmd
>>> d = PyQuery('<div class="root"><div class="zero"><span class="first">foo</span><span class="two">bar</span><img src=""/></div></div>')
>>>
>>> d('span').filter('.two')
[<span.two>]
>>>
```
* eq(self, index): 根据索引返回PyQuery
```cmd
>>> d = PyQuery('<div class="root"><div class="zero"><span class="first">foo</span><span class="two">bar</span><img src=""/></div></div>')
>>>
>>> d.find('span')
[<span.first>, <span.two>]
>>>
>>> d.find('span').eq(0)
[<span.first>]
>>>
>>> d.find('span').eq(1)
[<span.two>]
```
* size(self): 返回所定位节点数量
```cmd
>>> d = PyQuery('<div class="root"><div class="zero"><span class="first">foo</span><span class="two">bar</span><img src=""/></div></div>')
>>>
>>> d.find('span')
[<span.first>, <span.two>]
>>>
>>> d.find('span').size()
2
```
* attr(self, *args, \**kwargs): 元素属性操作
```cmd
>>> d = PyQuery('<div class="root"><div class="zero"><span class="first">foo</span><span class="two">bar</span><img src="http://abc.jpb"/></div></div>')
>>>
>>> d('img').attr('src')
'http://abc.jpb'
>>>
>>> d('img').attr('k1','v1')
[<img>]
>>>
>>> d('img').__html__()
'<img src="http://abc.jpb" k1="v1">'
>>>
>>> d('img').attr(**{'k1':'v1','k2':'v2'})
[<img>]
>>>
>>> d('img').__html__()
'<img src="http://abc.jpb" k1="v1" k2="v2">'
>>>
```
* 还有很多方法是对元素的属性,css,dom进行修改的,这些我暂时用得不多,用得比较多的是定位元素,获取元素的内容与属性。
<hr style="margin-top:100px">
:-: ![](https://box.kancloud.cn/2ff0bc02ec938fef8b6dd7b7f16ee11d_258x258.jpg)
***微信扫一扫,关注“python测试开发圈”,了解更多测试教程!***
- 前言
- chapter01_开发环境
- chapter02_字符串的使用
- chapter03_列表的使用
- chapter04_字典的使用
- chapter05_数字的使用
- chapter06_元组的使用
- chapter07_集合的使用
- chapter08_输入输出
- chapter09_控制流程
- chapter10_实例练习_登录1
- chapter11_python函数入门
- chapter12_python中的类
- chapter13_轻松玩转python中的模块管理
- chapter14_掌握学习新模块的技巧
- chapter15_通过os模块与操作系统交互
- chapter16_子进程相关模块(subprocess)
- chapter17_时间相关模块(time & datetime)
- chapter18_序列化模块(json)
- chapter19_加密模块(hashlib)
- chapter20_文件的读与写
- chapter21_阶段考核2_登录
- chapter22_小小算法挑战(排序&二分法)
- chapter23_用多线程来搞事!
- chapter24_HTTP接口请求(requests)
- chapter25_接口测试框架(pytest)
- chapter26_阶段考核3_HTTP接口测试
- chapter27_HTML解析(pyquery)
- chapter28_阶段考核4_爬虫下载网易汽车
- chapter29_python中的那些编码坑
- chapter30_MySQL数据库操作
- chapter31 高级特性_迭代器与生成器
- chapter32 高级特性_装饰器
- chapter33 高级特性_列表处理