🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[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测试开发圈”,了解更多测试教程!***