文章目录

  • PyQuery(from pyquery import PyQuery as pq)
    • 1、准备工作
    • 2、初始化
    • 3、查找节点
    • 4、伪类选择器
    • 5、获取节点信息
    • 6、节点操作

PyQuery(from pyquery import PyQuery as pq)

  • Pyquery是一个类似jquery(一个js库)的库,使用 lxml 进行快速 xml 和 html 操作,利用它可以直接解析DOM节点的结构,并通过DOM节点的一些属性快速进行内容提取。
  • Pyquery中常用的比较多的是利用CSS选择器来提取DOM节点。
  • CSS选择器用法:https://www.w3school.com.cn/cssref/css_selectors.asp

1、准备工作

  • 安装:pip install pyquery
  • 官方文档:PyQuery API文档

2、初始化

PyQuery初始化有三种:

  • 通过字符串(text)初始化PyQuery对象
  • 通过网址(url)初始化PyQuery对象
  • 通过文件名(filename)初始化PyQuery对象

initialize.html文件代码如下:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>通过文件进行初始化PyQuery对象</title>
</head>
<body><ul id="container"><li class="item">1</li><li class="item">2</li><li class="item">3</li></ul>
</body>
</html>

初始化代码如下:

'''功能如下:初始化PyQuery对象的三种方式:1. 通过字符串(text)初始化PyQuery对象2. 通过网址(url)初始化PyQuery对象3. 通过文件名(filename)初始化PyQuery对象
'''from pyquery import PyQuery as pqhtml = '''
<html lang="en"><head><title>PyQuery学习</title></head><body><ul id="container"><li class="object-1"/><li class="object-2"/><li class="object-3"/></ul></body>
</html>
'''# 通过字符串(text)初始化PyQuery对象
doc = pq(html)
print(doc('title').text())# 运行结果
# PyQuery学习# 通过网址(url)初始化PyQuery对象
doc = pq(url='http://www.baidu.com', encoding='utf-8')
print(doc('title').text())# 运行结果
# 百度一下,你就知道# 通过文件名(filename)初始化PyQuery对象
# 但是这种方式不适用于大文件。。。
with open('initialize.html', 'r', encoding='utf-8') as f:res = f.read()doc = pq(res)
print(doc('title').text())# 运行结果
# 通过文件进行初始化PyQuery对象

注意点:如果在读取文件使报错如下:UnicodeDecodeError: 'gbk' codec can't decode byte 0xa1 in position 98: illegal multibyte sequence
可以查看如下文章进行解决:GBK解码报错解决方案

3、查找节点

  • pyquery对象.items() 转换为生成器对象(迭代器的一种),再for循环遍历
  • CSS选择器:使用PyQuery时,CSS选择器能解决大部分的问题。
  • find()方法:查找所有的子孙节点。
  • children()方法:查找子节点。
  • parent()方法:获取某个节点的父节点。
  • parents()方法:获取某个节点的父节点和祖先节点
  • siblings()方法:获取兄弟节点
from pyquery import PyQuery as pq
html = '''
<div class='wrap'>
<div id="container"><ul class="list"><li class="item-0"><a href="link1.html">first item</a></li><li class="item-1"><a href="link2.html">second item</a></li><li class="item-0 active"><a href="link3.html">third item</a></li><li class="item-1 active"><a href="link4.html">fourth item</a></li><li class="item-0"><a href="link5.html">fifth item</a></li></ul></div></div>
'''
doc = pq(html)'''pyquery对象.items() 转换为生成器对象(迭代器的一种),再for循环遍历'''
data = doc('li').items()  # 返回生成器对象
print(type(data))
for i in data:print(i)
# 运行结果
# <class 'generator'>
# <li class="item-0"><a href="link1.html">first item</a></li>
# <li class="item-1"><a href="link2.html">second item</a></li>
# <li class="item-0 active"><a href="link3.html">third item</a></li>
# <li class="item-1 active"><a href="link4.html">fourth item</a></li>
# <li class="item-0"><a href="link5.html">fifth item</a></li>'''选取id为container中class为list的节点'''
ul_item = doc('#container .list')
print(type(ul_item))
print(ul_item)#运行结果
# <class 'pyquery.pyquery.PyQuery'>
# <li class="item-0"><a href="link1.html">first item</a></li>
#          <li class="item-1"><a href="link2.html">second item</a></li>
#          <li class="item-0 active"><a href="link3.html">third item</a></li>
#          <li class="item-1 active"><a href="link4.html">fourth item</a></li>
#          <li class="item-0"><a href="link5.html">fifth item</a></li>'''选取其内部所有的li节点,find()查找所有子孙节点'''
lis = ul_item.find('li')
print(type(lis))
print(lis)#运行结果
# <class 'pyquery.pyquery.PyQuery'>
# <li class="item-0"><a href="link1.html">first item</a></li>
#          <li class="item-1"><a href="link2.html">second item</a></li>
#          <li class="item-0 active"><a href="link3.html">third item</a></li>
#          <li class="item-1 active"><a href="link4.html">fourth item</a></li>
#          <li class="item-0"><a href="link5.html">fifth item</a></li>'''选取其内部子节点,children()查找子节点'''
lis = ul_item.children()
print(type(lis))
print(lis)#运行结果
# <class 'pyquery.pyquery.PyQuery'>
# <li class="item-0"><a href="link1.html">first item</a></li>
#          <li class="item-1"><a href="link2.html">second item</a></li>
#          <li class="item-0 active"><a href="link3.html">third item</a></li>
#          <li class="item-1 active"><a href="link4.html">fourth item</a></li>
#          <li class="item-0"><a href="link5.html">fifth item</a></li>'''筛选出子节点中class为active的节点'''
lis = ul_item.children('.active')
print(type(lis))
print(lis)#运行结果
# <class 'pyquery.pyquery.PyQuery'>
# <li class="item-0 active"><a href="link3.html">third item</a></li>
#          <li class="item-1 active"><a href="link4.html">fourth item</a></li>'''#parent()获取某个节点的父节点'''
container = ul_item.parent()
print(type(container))
print(container)#运行结果
# <class 'pyquery.pyquery.PyQuery'>
# <div id="container">
#     <ul class="list">
#          <li class="item-0"><a href="link1.html">first item</a></li>
#          <li class="item-1"><a href="link2.html">second item</a></li>
#          <li class="item-0 active"><a href="link3.html">third item</a></li>
#          <li class="item-1 active"><a href="link4.html">fourth item</a></li>
#          <li class="item-0"><a href="link5.html">fifth item</a></li>
#      </ul>
#  </div>'''parents()获取某个节点的祖先节点,返回所有祖先节点'''
parents = ul_item.parents()
for parent in parents.items():print(type(parent))print(parent)#运行结果
# <class 'pyquery.pyquery.PyQuery'>
# <div class="wrap">
# <div id="container">
#     <ul class="list">
#          <li class="item-0"><a href="link1.html">first item</a></li>
#          <li class="item-1"><a href="link2.html">second item</a></li>
#          <li class="item-0 active"><a href="link3.html">third item</a></li>
#          <li class="item-1 active"><a href="link4.html">fourth item</a></li>
#          <li class="item-0"><a href="link5.html">fifth item</a></li>
#      </ul>
#  </div>
#  </div>
# <class 'pyquery.pyquery.PyQuery'>
# <div id="container">
#     <ul class="list">
#          <li class="item-0"><a href="link1.html">first item</a></li>
#          <li class="item-1"><a href="link2.html">second item</a></li>
#          <li class="item-0 active"><a href="link3.html">third item</a></li>
#          <li class="item-1 active"><a href="link4.html">fourth item</a></li>
#          <li class="item-0"><a href="link5.html">fifth item</a></li>
#      </ul>
#  </div>'''parents()获取wrap祖先节点的数据'''
parents = ul_item.parents('.wrap')
print(type(parents))
print(parents)#运行结果
# <class 'pyquery.pyquery.PyQuery'>
# <div class="wrap">
# <div id="container">
#     <ul class="list">
#          <li class="item-0"><a href="link1.html">first item</a></li>
#          <li class="item-1"><a href="link2.html">second item</a></li>
#          <li class="item-0 active"><a href="link3.html">third item</a></li>
#          <li class="item-1 active"><a href="link4.html">fourth item</a></li>
#          <li class="item-0"><a href="link5.html">fifth item</a></li>
#      </ul>
#  </div>
#  </div>'''siblings()获取兄弟节点'''
li = doc('.list .item-0.active')
print(li.siblings())
print(li.siblings('.active'))#运行结果
# <li class="item-1"><a href="link2.html">second item</a></li>
# <li class="item-0"><a href="link1.html">first item</a></li>
# <li class="item-1 active"><a href="link4.html">fourth item</a></li>
# <li class="item-0"><a href="link5.html">fifth item</a></li># <li class="item-1 active"><a href="link4.html">fourth item</a></li>

4、伪类选择器

方法 说明
:first-child 获取第一个节点
:last-child 获取最后一个节点
:nth-child(N) 获取第N个节点,N=1,2,…
:nth-child(2n) 获取偶数位置的全部节点
:nth-child(2n-1) 获取奇数位置的全部节点
:gt(N) 获取索引大于N的节点,N=0,1,…
:contains(‘first item’) 获取文本包含"first item"的节点
from pyquery import PyQuery as pq
html = '''
<div class='wrap'>
<div id="container"><ul class="list"><li class="item-0"><a href="link1.html">first item</a></li><li class="item-1"><a href="link2.html">second item</a></li><li class="item-0 active"><a href="link3.html">third item</a></li><li class="item-1 active"><a href="link4.html">fourth item</a></li><li class="item-0"><a href="link5.html">fifth item</a></li></ul></div></div>
'''
doc = pq(html)'''选择第一个节点'''
li = doc('li:first-child')
print(type(li))
print(li)
# 运行结果
# <li class="item-0"><a href="link1.html">first item</a></li>'''获取最后一个节点'''
li = doc('li:last-child')
print(type(li))
print(li)
# 运行结果
# <li class="item-0"><a href="link5.html">fifth item</a></li>'''获取第N个节点,N=1,2,...'''
li = doc('li:nth-child(1)')  # 节点从1开始算起
print(type(li))
print(li)
# 运行结果
# <class 'pyquery.pyquery.PyQuery'>
# <li class="item-0"><a href="link1.html">first item</a></li>'''获取偶数位置的全部节点'''
li = doc('li:nth-child(2n)')  # 节点从1开始算起
print(type(li))
print(li)
# 运行结果
# <class 'pyquery.pyquery.PyQuery'>
# <li class="item-1"><a href="link2.html">second item</a></li>
#          <li class="item-1 active"><a href="link4.html">fourth item</a></li>'''获取奇数位置的全部节点'''
li = doc('li:nth-child(2n-1)')  # 节点从1开始算起
print(type(li))
print(li)
# 运行结果
# <class 'pyquery.pyquery.PyQuery'>
# <li class="item-0"><a href="link1.html">first item</a></li>
#          <li class="item-0 active"><a href="link3.html">third item</a></li>
#          <li class="item-0"><a href="link5.html">fifth item</a></li>'''获取索引大于N的节点,N=0,1,...'''
li = doc('li:gt(0)')  # 节点从0开始算起,>0说明排除第一个
print(type(li))
print(li)
# 运行结果
# <class 'pyquery.pyquery.PyQuery'>
# <li class="item-1"><a href="link2.html">second item</a></li>
#          <li class="item-0 active"><a href="link3.html">third item</a></li>
#          <li class="item-1 active"><a href="link4.html">fourth item</a></li>
#          <li class="item-0"><a href="link5.html">fifth item</a></li>'''获取文本包含"first item"的节点'''
li = doc('li > a:contains("first item")')
print(type(li))
print(li)
# 运行结果
# <class 'pyquery.pyquery.PyQuery'>
# <a href="link1.html">first item</a>

5、获取节点信息

  • attr()方法:获取属性名
  • text()方法:获取文本
  • html()方法:获取节点内部的HTML文本
from pyquery import PyQuery as pq
html = '''
<div class='wrap'>
<div id="container"><ul class="list"><li class="item-0"><a href="link1.html">first item</a></li><li class="item-1"><a href="link2.html">second item</a></li><li class="item-0 active"><a href="link3.html">third item</a></li><li class="item-1 active"><a href="link4.html">fourth item</a></li><li class="item-0"><a href="link5.html">fifth item</a></li></ul></div></div>
'''
doc = pq(html)'''获取属性值——attr()'''
print(doc('li:first-child').attr('class'))
# 运行结果
# item-0'''获取文本——text()'''
print(doc('li:first-child').text())
# 运行结果
# first item'''获取节点内部的HTML文本——html()'''
print(doc('li:first-child').html())
# 运行结果
# <a href="link1.html">first item</a>

6、节点操作

PyQuery中的常见用法如下:

  • remove()方法:移除指定节点
  • remove_class()方法:移除class属性
  • remove_attr()方法:移除一个属性
  • addClass()方法:增加class属性
from pyquery import PyQuery as pq
html = '''
<div class='wrap'>
<div id="container"><ul class="list"><li class="item-0"><a href="link1.html">first item</a></li><li class="item-1"><a href="link2.html">second item</a></li><li class="item-0 active"><a href="link3.html">third item</a></li><li class="item-1 active"><a href="link4.html">fourth item</a></li><li class="item-0"><a href="link5.html">fifth item</a></li></ul></div></div>
'''
doc = pq(html)'''移除指定节点——remove()'''
print(doc('li:first-child').remove())  # 删除li的第一个节点
print(doc)
# 运行结果
# <div class="wrap">
# <div id="container">
#     <ul class="list">
#
#          <li class="item-1"><a href="link2.html">second item</a></li>
#          <li class="item-0 active"><a href="link3.html">third item</a></li>
#          <li class="item-1 active"><a href="link4.html">fourth item</a></li>
#          <li class="item-0"><a href="link5.html">fifth item</a></li>
#      </ul>
#  </div>
#  </div>'''移除class属性——remove_class()'''
print(doc('li:nth-child(3)').remove_class('active'))
print(doc)
# 运行结果
# <div class="wrap">
# <div id="container">
#     <ul class="list">
#
#          <li class="item-1"><a href="link2.html">second item</a></li>
#          <li class="item-0 active"><a href="link3.html">third item</a></li>
#          <li class="item-1"><a href="link4.html">fourth item</a></li>
#          <li class="item-0"><a href="link5.html">fifth item</a></li>
#      </ul>
#  </div>
#  </div>'''移除某一个属性——remove_attr()'''
print(doc('li:last-child').remove_attr('class'))
print(doc)
# 运行结果
# <div class="wrap">
# <div id="container">
#     <ul class="list">
#
#          <li class="item-1"><a href="link2.html">second item</a></li>
#          <li class="item-0 active"><a href="link3.html">third item</a></li>
#          <li class="item-1"><a href="link4.html">fourth item</a></li>
#          <li><a href="link5.html">fifth item</a></li>
#      </ul>
#  </div>
#  </div>'''增加class属性——addClass()'''
print(doc('li:last-child').add_class('item5'))
print(doc)
# 运行结果
# <div class="wrap">
# <div id="container">
#     <ul class="list">
#
#          <li class="item-1"><a href="link2.html">second item</a></li>
#          <li class="item-0 active"><a href="link3.html">third item</a></li>
#          <li class="item-1"><a href="link4.html">fourth item</a></li>
#          <li class="item5"><a href="link5.html">fifth item</a></li>
#      </ul>
#  </div>
#  </div>

Python_PyQuery使用相关推荐

  1. Python_PyQuery模块打开本地文件报错UnicodeDecodeError: 'gbk' codec can't decode byte 0xa0 in position 84

    问题描述:在使用pyquery.PyQuery打开本地文件的时候,会报错,不是安装的问题,报错如下 UnicodeDecodeError: 'gbk' codec can't decode byte ...

最新文章

  1. matlab在测量数据处理中的应用,MATLAB在测量数据处理中的应用
  2. 01《软件需求分析教程》
  3. Linux C:管道的实现原理,命名管道
  4. python 创建类_python 用type()创建类
  5. php进入文件目录,php文件目录操作
  6. 新手零基础入门小程序之万达电影
  7. unity3d-ngui UIScrollView 滚动方向与滚轮相反
  8. JavaScript学习(八十四)—变量
  9. 百密一疏,防不胜防,细数那些大型数据库建设过程中绕不开的坑
  10. [expimp]exp导出笔记
  11. Kubernetes核心技术--Pod,Label,Volume,Service,Deployment详解
  12. com.google.zxing 二维码生成与解析
  13. 第08课:GDB 实用调试技巧( 上)
  14. html怎么设置华文行楷,css如何修改字体为华文行楷
  15. Robotium体验----白盒
  16. 数据挖掘—Apriori算法
  17. 分解质因数FZU - 1075
  18. 公式图片转换成Word格式
  19. 星际争霸2 AI开发(持续更新)
  20. NIST的安全内容自动化协议(SCAP)以及SCAP中文社区简介

热门文章

  1. 双十一,几何画板加入购物车了吗?
  2. 创建“网上书店”数据库和在数据库中创建表
  3. WordPress导航主题源码 webstack pro V2.0406主题
  4. 2.5 Visio2007不规则图形填充
  5. CDOJ 1284 苦恼的郭大侠 map启发式合并
  6. 【应用安全】 使用Java创建和验证JWT
  7. Rosetta Stone (罗赛塔石碑) for Mac 美式英语1-5级语言包下载
  8. Leetcode042接雨水039直方图最大矩形面积
  9. 2019盖茨年信,以及30个关于比尔盖茨的真相
  10. 老电工教你快速学会如何看懂电气控制电路图