Python 中 PyQuery 库

PyQuery库

一、 简介

1、 概述

pyquery库是jQuery的Python实现,能够以jQuery的语法来操作解析 HTML 文档,易用性和解析速度都很好

PyQuery是一个类似于jQuery的解析网页工具,使用lxml操作xml和html文档,它的语法和jQuery很像。和XPATH,Beautiful Soup比起来,PyQuery更加灵活,提供增加节点的class信息,移除某个节点,提取文本信息等功能

PyQuery是强大而又灵活的网页解析库,如果你觉得正则写起来太麻烦,如果你觉得BeautifulSoup语法太难记,如果你熟悉jQuery的语法,如果你觉得xpath用法单一。那么,PyQuery就是你绝佳的选择

2、 安装

pip install pyquery

3、 导包

from pyquery import PyQuery as pq

二、 用法详解

1、 初始化

初始化PyQuery对象

  • html文档的所有操作都需要PyQuery对象来完成,初始化PyQuery对象主要有三种方式,分别是通过网址、字符串和文件名创建

1.1 字符串初始化

html = 
"""
<div>
	<ul>
		<li class="item" data-index="0"> first </li>
		<li class="item" data-index="1"> second </li>
		<li class="item" data-index="2"> third </li>
	</ul>
</div>
"""
doc = pq(html)

1.2 URL 初始化

headers = {
    'User-Agent': "Mozilla / 5.0(Windows NT 10.0;Win64;x64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 96.0.4664 .93 Safari / 537.36",
}
doc = pq(url="http://www.baidu.com", headers=headers)  # 其会自动请求这个链接

1.3 文件初始化

doc = pq(filename="./demo.html")

2、 CSS选择器

2.1 属性选择器

css 选择器在 W3C 里面有,下面列举部分常用的选择器

名称 用法 描述
ID 选择器 doc("#id") 获取指定 ID 的元素
全选选择器 doc("*") 匹配所有元素
类选择器 doc(".class") 获取同一类 class 的元素
标签选择器 doc("div") 获取同一标签所有元素
并集选择器 doc("div, p, li") 选取多个元素
交集选择器 doc("li.current") 交集选择器
子代选择器 doc("ul>li") 使用 > 号,获取亲儿子层级的元素
后代选择器 doc("ul li") 使用空格,代表后代选择器,包括孙子等

还有 [element=value] :得到特定属性值的元素

2.2 节点选择器

语法 用法 说明
parent() doc("li").parent() 查找父级
children(selector) doc("ul").children("li") 查找最近一级(亲儿子)子代选择器
find(selector) doc("ol").find("li") 相当于后代选择器
siblings(selector) doc(".first").siblings("li") 查找兄弟节点,不包括自己本身
next_all([expr]) doc(".first").next_all() 查找当前元素之后所有的同辈元素
prevt_all([expr]) doc(".last").prevt_all() 查找当前元素之前所有的同级元素
has_class(className) doc("div").has_class("protected") 检查当前元素是否有某个特定的类
eq(index) doc("li").eq(2) 获取到的 li 元素中,选择索引号为 2 的元素,索引号从 0 开始

注意:

  • next_all:其得到的值为 xpath_Element 对象,可以通过 xpath 解析出来

parents("选择器"):选择符合条件的祖先元素

2.3 筛选选择器

语法 用法 描述
:first doc("li:first"); 获取第一个 li 元素
:last doc("li:last"); 获取最后一个 li 元素
:eq(index) doc("li:eq(2)"); 获取到的 li 元素中,选择索引号为 2 的元素,索引号从 0 开始
:odd doc("li:odd"); 获取到的 li 元素中,选择索引号为奇数的元素
:even doc("li:even"); 获取到的 li 元素中,选择索引号为偶数的元素

3、元素操作

3.1 遍历元素

那要取多个li节点的属性值,要怎么做呢?这就要结合 items 方法来实现。items()方法是返回的节点的生成器generator object PyQuery.items

li = pq(html)('li')
print(li.items())  # items 获取
for item in li.items():
    print(item)

3.2 获取属性值

语法:

doc('div').attr("id")  # 如果有两个值,其为修改样式

4、 样式操作

4.1 修改样式

直接使用 css 方法修改元素的样式

doc("div").css(
	# 内部存放字典
)

作用等同于 classList,可以操作样式,注意操作类里面的参数不要加点

  1. 添加类

    doc("div").add_class("current");  # 注意不要添加 .
    
  2. 删除类

    doc("div").remove_class("current");  # 注意不要添加 .
    
  3. 切换类

    doc("div").toggle_class("current");  # 如果没有这个类就添加,有就删除这个类
    

5、 获取值

5.1 获取属性值

attr 方法获取

doc('div').attr("id")

5.2 获取文本值

text 方法获取

doc("div").text()  

如果多个节点有值,获取所有节点的文本,中间使用空格分隔

5.3 获取 HTML 元素

html 方法获取

doc("div").html()  

三、 总结

通过观察 PyQuery 库的部分语法,我们发现其使用方法与 jQuery 的语法高度相似

可以通过学习 jQuery 语法来加快理解 PyQuery

posted @ 2022-02-27 21:38  Kenny_LZK  阅读(230)  评论(0编辑  收藏  举报