PyQuery库 简单使用

后端 / 2020-03-10

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” 的所有元素
**选择所有元素
elementp选择所有的p元素
element elementdiv p选择 div 下 所有p节点
element,elementdiv,p选择 所有div元素和p元素
[attr][target]选择所有带有target属性的元素
[arrt=valur][target=_blank]选择 所有 target=“_blank”的元素
element1~element2p~ul选择所有 前面有p标签的 ul
:first-childp:first-child选择属于父元素的第一个子元素p
:only-of-typep: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>标签之间的区别">认识&lt;br&gt;与&lt;p&gt;标签之间的区别</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 中文开发者社区 手册列表

https://docs.pythontab.com/

#!/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'}

结束