pyquery
使用
安装
pip install pyquery
调用
from pyquery import PyQuery as pq
初始化
- 字符串初始化
from pyquery import PyQuery as pq html=``` <html> <body> <p> 这是标签内容 </p> </body> </html> ``` doc=pq(html)
- url初始化
from pyquery import PyQuery as pq doc=pq(url='https://cuiqingcai.com') print(doc('title'))
- 文件初始化
from pyquery import PyQuery as pq doc=pq(filename='demo.html') print(doc('title'))
css选择器
基础用法
选择器 例子 描述 .class .intro 选择 class=“intro”的所有元素 # #name 选择 id=“name” 的所有元素 * * 选择所有元素 element p 选择所有的p元素 element element div p 选择 div 下 所有p节点 element,element div,p 选择 所有div元素和p元素 [attr] [target] 选择所有带有target属性的元素 [arrt=valur] [target=_blank] 选择 所有 target=“_blank”的元素 element1~element2 p~ul 选择所有 前面有p标签的 ul :first-child p:first-child 选择属于父元素的第一个子元素p :only-of-type p:only-of-type 选择 p元素 唯一一个子元素 p :nth-child(2) p:nth-child(2) 选择属于其父元素的第二个子元素的每个 元素
- 带 · 的 是 类
- 带 # && [ ] 是 属性
- 带 空格 是子节点
- 小试牛刀
#!/usr/bin/env python3 # -*- coding:utf-8 -*- from pyquery import PyQuery as pq def main(): html=''' <div class="layui-tab-item layui-show"><ul><p class="top-img"><a href="/toutiao-387072.html" target="_blank" title="面对巨额亏损的PHP中文网,我该为情怀买单吗?(猪哥)"><img src="https://img.php.cn/upload/article/000/000/003/5b890a9e4417f872.png" style="width: 100%"></a></p><li><a href="/div-tutorial-409203.html" target="_blank" title="html p标签怎么换行?html p标签添加br换行标签的应用">html p标签怎么换行?html p标签添加br换行标签的应用</a></li><li><a href="/div-tutorial-409470.html" target="_blank" title="html怎么换行?换行代码是什么?九种html文字换行方法总结">html怎么换行?换行代码是什么?九种html文字换行方法总结</a></li><li><a href="/div-tutorial-409786.html" target="_blank" title="html怎样设置背景颜色?HTML背景颜色代码详细分析">html怎样设置背景颜色?HTML背景颜色代码详细分析</a></li><li><a href="/div-tutorial-381329.html" target="_blank" title="六款好用的html5编辑器">六款好用的html5编辑器</a></li><li><a href="/div-tutorial-380634.html" target="_blank" title="认识<br>与<p>标签之间的区别">认识<br>与<p>标签之间的区别</a></li><li><a href="/div-tutorial-412520.html" target="_blank" title="HTML编辑器有哪些?最好用的4款HTML编辑器推荐">HTML编辑器有哪些?最好用的4款HTML编辑器推荐</a></li><li><a href="/div-tutorial-409380.html" target="_blank" title="html搜索框怎么设置?html搜索框input标签的使用方法实例">html搜索框怎么设置?html搜索框input标签的使用方法实例</a></li><li><a href="/div-tutorial-411544.html" target="_blank" title="如何制作一个简单的HTML登录页面(附代码)">如何制作一个简单的HTML登录页面(附代码)</a></li></ul></div> ''' doc = pq(html) # 选择 所有 a 标签 print(doc('a')) # 选择 div 下 的 ul 子节点 li print(doc('div ul li')) # 选择 类为 layui-tab-item layui-show 的div 标签 # 需要注意的是 碰到类名 中 有空格的 可以用.代替 print(doc('.layui-tab-item.layui-show')) # 选择 指定属性 标题元素 print(doc('[title=六款好用的html5编辑器]').text()) if __name__ == '__main__': main()
渐入佳境
有时候 我们碰到这样的节点
- 父
- 子
- 子
- 子
像上面这种结构 他们的子节点都是相同属性 因此 我们使用 items 会全部取出 但是 ,我们只想要 第一个或者第二个节点该怎么办!
xxx:nth-child(2)
这样就可以实现
下面我们来一个 小小的实战 来 验证
大展拳脚
查找节点
- 子节点
find() 方法
传入参数为 css 选择器
查找范围 为所有 子孙节点
如果想只查找 子节点 可以用 children() 方法
- 父节点
parent() 方法
获取某个节点父节点
- 兄弟节点
siblings() 方法
获取某个节点的兄弟节点
- 遍历
items() 方法
返回一个生成器
用 for 循环处理
- 获取属性
attr() 方法
直接传入 属性名称 获取值
- 获取文本
text() 方法
忽略掉节点所有html 内容 返回纯文字
节点操作
- 增加
- addClass
- 删除
- removeClass
- remove
伪类选择器
css 选择器之所以强大是因为 他支持多种多样的伪类选择器 例如选择第一个节点 最后一个节点 奇偶 数节点 包含某以文本的节点 等。
- li:first-child
- 第一个节点
- li:last-child
- 最后一个节点
- li:nth-child(2)
- 第二个节点
- li:gt(2)
- 偶数位置节点
- li:contains(second)
- 包含second 节点
实战篇
爬取python 中文开发者社区 手册列表
#!/usr/bin/env python3 # -*- coding:utf-8 -*- import requests from pyquery import PyQuery as pq def main(): list = one_page() for i in list: print(i) def one_page(): headers = { 'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Mobile Safari/537.36' } response = requests.get('https://docs.pythontab.com/', headers=headers) doc =pq(response.text) list = doc('.span4').items() for i in list: title = i('.thumbnail h3').text() content = i('.thumbnail p').text() url = i('.thumbnail a').attr('href') # 去杂 url=url.replace('http://docs.pythontab.com/','') url = 'http://docs.pythontab.com/' + url yield{ 'title':title, 'content':content, 'url':url } if __name__ == '__main__': main()
{'title': 'Python2.7中文手册', 'content': 'Python语法简洁而清晰,具有丰富和强大的类库。应用于图形处理、数学处理、网络编程、Web编程、黑客编程、数据库编程、系统编程等,python2 版本是最稳定版本,也是使用最广泛的版本', 'url': 'http://docs.pythontab.com/python/python2.7'} {'title': 'Python3.5中文手册', 'content': 'Python3作为重大升级版本,为了不带入过多的累赘而没有向下兼容,是面向未来的一个版本。应用于图形处理、数学处理、网络编程、Web编程、黑客编程、数据库编程、系统编程等...', 'url': 'http://docs.pythontab.com/python/python3.5'} {'title': '零基础学Python', 'content': '10天快速学会Python,Python学习必读教程!循序渐进地带你进入Python的世界,通俗易懂的讲解,细致入微的分析,经典的实例练习,让你快速掌握知识,上手开发...', 'url': 'http://docs.pythontab.com//learnpython'} {'title': '《Python进阶》中文版', 'content': '《Python进阶》是国外资深开发者Yasoob所著,由国内开发者翻译而来,本书用最简洁的例子精辟地展现了原理,是你Python进阶路上不可多得的精品教程 ...', 'url': 'http://docs.pythontab.com//interpy'} {'title': 'TensorFlow中文手册', 'content': 'TensorFlow 是Google推出的第二代人工智能机器学习系统,TensorFlow可被用于语音识别或图像识别等多项机器深度学习领域,大大降低深度学习在各个行业中的应用难度...', 'url': 'http://docs.pythontab.com/tensorflow/'} {'title': 'Scrapy中文手册', 'content': 'Python开发的一个快速,高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试...', 'url': 'http://docs.pythontab.com/scrapy/scrapy0.24'} {'title': 'Beautiful Soup 4 中文手册', 'content': 'Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能是非常优秀的HTML/XML的解析器,是开发爬虫必不可少的工具,会帮你节省数小时甚至数天的工作时间...', 'url': 'http://docs.pythontab.com/beautifulsoup4/'} {'title': 'Django1.5中文手册', 'content': 'Django是Python的Web框架中的重要一员,是使用最广泛的Python web框架之一。Django的主要目的是简便、快速的开发数据库驱动的网站。使用Django可以非常快速的开发出完整的网站。', 'url': 'http://docs.pythontab.com/django/django1.5'} {'title': 'Tornado入门手册', 'content': 'Tornado是使用Python编写的一个强大的、可扩展的Web服务框架,是非阻塞式web服务器。Tornado有出色的抗负载能力,速度相当快。FriendFeed和Facebook等多个大型网站在使用Tornado。', 'url': 'http://docs.pythontab.com/tornado/introduction-to-tornado'} {'title': 'Flask中文手册', 'content': 'Flask是一个轻量级的Web应用框架, 使用Python编写。基于 WerkzeugWSGI工具箱和 Jinja2模板引擎。Flask保留了扩增的弹性,可以用Flask-extension加入这些功能:ORM、窗体验证工具...', 'url': 'http://docs.pythontab.com/flask/flask0.10'} {'title': 'Git中文手册', 'content': 'Git是一个分布式的版本控制系统,由Linus Torvalds编写,用作Linux内核代码的管理。在推出后,Git在其它项目中也取得了很大成功。本手册是github官方手册中文翻译版,帮助你掌握git的使用', 'url': 'http://docs.pythontab.com/github/gitbook'} {'title': 'Nginx中文手册', 'content': 'Nginx是一个高性能的轻量级的HTTP和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。其特点是占有内存少,并发能力强,在高连接并发的情况下,Nginx是Apache服务器不错的替代品...', 'url': 'http://docs.pythontab.com/nginx/nginx-book'} {'title': 'Redis中文手册', 'content': 'Redis是一个高性能的key-value数据库。redis的出现,很大程度补偿了memcached的不足,可以对关系数据库起到很好的补充作用。Redis在国内互联网公司使用非常广泛,新浪微博就是一个典型案例...', 'url': 'http://docs.pythontab.com/redis/redisbook'} {'title': 'Nodejs中文手册', 'content': 'Node.js是一个基于JavaScriptV8引擎的运行平台,用于搭建响应速度快、易于扩展的网络应用。它使用了事件驱动、非阻塞式 I/O 的模型,轻量又高效,非常适合数据密集型的实时应用...', 'url': 'http://docs.pythontab.com/nodejs/'} {'title': 'Jinja2中文手册', 'content': 'Jinja2是Python下一个被广泛应用的模版引擎,他的设计思想来源于Django的模板引擎,并扩展了其语法和一系列强大的功能。增加了沙箱执行功能和自动转义功能,这对应用的安全性来说是非常重要的', 'url': 'http://docs.pythontab.com/jinja/jinja2'}