PyQuery常用用法总结
什么是PyQuery
PyQuery是一个类似于jQuery的解析网页工具,使用lxml操作xml和html文档,它的语法和jQuery很像。和XPATH,Beautiful Soup比起来,PyQuery更加灵活,提供增加节点的class信息,移除某个节点,提取文本信息等功能。
初始化PyQuery对象
html文档的所有操作都需要PyQuery对象来完成,初始化PyQuery对象主要有三种方式,分别是通过网址、字符串和文件名创建。
方式一:通过网址初始化PyQyery对象
先看一段代码:
from pyquery import PyQuery as pqs = '<html><title>PyQuery用法总结<title></html>'
doc = pq(s)
print(doc('title'))
运行结果:
<title>PyQuery用法总结</title>
首先要import PyQuery类,然后将字符串传递给PyQuery类,这样就生成了一个PyQuery对象,通过该对象就可以访问字符串中的title节点。
PyQuery还会将残缺的html文档补全。看下面的代码:
from pyquery import PyQuery as pqs = '<html><title>PyQuery用法总结</title>'
doc = pq(s)
print(doc('html'))
运行的结果:
<html><head><title>PyQuery用法总结</title></head></html>
可以我们的字符串的html节点是没有闭合的,并且缺少head节点。初始化PyQuery对象之后,会把html文档补全,并且自动加上head节点。
方式二:URL网址初始化PyQyery对象
将要解析的URL网址当做参数传递给PyQuery类:
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
from pyquery import PyQuery as pqurl = 'http://www.bigdata17.com'
doc = pq(url=url,encoding='utf-8')
print(doc('title'))
运行结果:
<title>Home - Summer哥的自留地</title>
方式三:通过文件初始化PyQyery对象
这个方式也比较常用,很多时候我们会将网站爬取下来然后保存在本地磁盘:
from pyquery import PyQuery as pqdoc = pq(filename='test_pyquery.html',encoding='utf-8')
print(doc('title'))
访问节点属性:
使用attr()方法访问节点的属性:
from pyquery import PyQuery as pq
li = pq('<li id="test1" class="test1"></li><li id="test2" class="test2"></li>')('li')
print(li.attr("id"))
运行结果:
test1
上面的代码中有两个id不同的li节点,但是attr()方法只取第一个li节点的id属性值,而不取第二个,我们把上面的代码修改下,把第一个li节点的id属性去掉,attr方法是否只取第一个复合条件节点的属性值:
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
from pyquery import PyQuery as pq
li = pq('<li class="test1"></li><li id="test2" class="test2"></li>')('li')
print(li.attr("id"))
运行结果:
None
第一个li节点没有id属性,因此返回结果为None,所以可见,attr()方法返回的是第一个节点的属性值。
那要取多个li节点的属性值,要怎么做呢?这就要结合items()方法来实现。items()方法是返回的节点的生成器generator object PyQuery.items
:
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
from pyquery import PyQuery as pq
li = pq('<li id="test1" class="test1"></li><li id="test2" class="test2"></li>')('li')
print(li.items())
for item in li.items():print(item.attr("id"))
运行结果:
<generator object PyQuery.items at 0x0000027F26082728>
test1
test2
动态添加节点属性
PyQuery有很多方法动态添加节点的属性,我们挑选几个比较常用的方法介绍个大伙。
addClass(),动态添加节点class属性:
from pyquery import PyQuery as pq
html = '<li id="test1" class="test1"></li>'
li = pq(html)('li')
li.addClass("addClass")
print(li)
运行结果:
<li id="test1" class="test1 addClass"/>
可见li节点的calss属性值有test1变为test1 addclass。
addClass()方法只能动态添加节点class属性的值,能不能动态添加其他属性呢?答案是当然可以,attr()方法就可以实现:
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
from pyquery import PyQuery as pq
html = '<li id="test1" class="test1"></li>'
li = pq(html)('li')
li.attr("name","li name")
print(li)
li.attr("type","li")
print(li)
print(li.attr("type"))
运行结果:
<li id="test1" class="test1" name="li name"/>
<li id="test1" class="test1" name="li name" type="li"/>
li
上面的代码一共执行了3次attr()方法,执行第一次attr()方法时,有两个参数,分别是name和li name。这是给li节点添加name属性及属性值。执行第二次attr()方法也有两个参数,分别是type和li,这是给li几点添加type属性及type属性值。执行第三次方法attr()方法只有一个type参数,根据前面介绍的attr()方法的用法可知,是获取li节点type属性的值。
小结: attr()方法只有一个参数时,是获取节点的属性值,有两个参数时,是给节点添加属性及属性值,第一个参数时属性,第二个参数时属性值。
removeClass(),动态移除节点的class属性:
from pyquery import PyQuery as pq
html = '<li id="test1" class="test1"></li>'
li = pq(html)('li')
li.removeClass("test1")
print(li)
运行结果:
<li id="test1" class=""/>
将class节点的属性值有test1变为“”。
动态添加/修改文本值
PyQuery支持动态给节点添加文本值:
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
from pyquery import PyQuery as pq
html = '<li id="test1" class="test1"></li>'
li = pq(html)('li')
li.html("use html() dynamic add text")
print(li)
li.text("use text() dynamic add text")
print(li)
运行结果:
<li id="test1" class="test1">use html() dynamic add text</li>
<li id="test1" class="test1">use text() dynamic add text</li>
可见使用html()和text()方法都可以动态的给节点添加或修改节点的文本值。
获取节点文本值
PyQuery提供text()和html()方法获取节点的文本属性值:
from pyquery import PyQuery as pq
html = '<li id = "test_id">li text value</li>'
li = pq(html)('li')
print(li.text())
print(li.html())
运行结果:
li text value
li text value
小结: html()和text()如果没参数,则是获取属性的文本值,如果有参数,则是改变或者添加节点的属性值。
移除节点:
remove()方法可以动态移除节点:
from pyquery import PyQuery as pq
html = '''
<ul>
hello I am ul tag
<li>hello I am li tag</li>
</ul>
'''
ul = pq(html)('ul')
print(ul.text())
print('执行remove()移除节点')
ul.find('li').remove()
print(ul.text())
运行结果:
hello I am ul tag
hello I am li tag
执行remove()移除节点
hello I am ul tag
上述代码的ul节点中有个li节点,执行ul.text()方法会返回包括li节点的文本信息,如果我们不想返回li节点的文本信息,仅仅只需要ul节点的文本信息“hell I am ul tag”,要怎么做呢?这时候remove()方法就派上用场了,它删除掉ul节点内的li节点。
查找节点
PyQuery支持使用css的.和#来查找节点:
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
from pyquery import PyQuery as pq
html = '''
<div class="div_tag">
<ul id = "ul_tag">
hello I am ul tag
<li>hello I am li tag</li>
<li>hello I am li tag too</li>
</ul>
</div>
'''
doc = pq(html)
print(doc('.div_tag #ul_tag li'))
运行结果:
<li>hello I am li tag</li>
<li>hello I am li tag too</li>
上述代码是通过.div_tag获取class为div_tag的节点,然后通过#ul_tag获取id为ul_tag的节点,最后返回所有的li节点。
find()方法查找节点:
html = '''
<div class="div_tag">
<ul id = "ul_tag">
hello I am ul tag
<li>hello I am li tag<a>www.bigdata17.com</li>
<li>hello I am li tag too</li>
</ul>
</div>
'''
doc = pq(html)
print(doc('.div_tag #ul_tag').find("li"))
运行结果:
<li>hello I am li tag<a>www.bigdata17.com</a></li>
<li>hello I am li tag too</li>
可见find(“li”)是把所有li节点及子节点都查找出来。
还有一个children()方法,是获取当前节点的所有子节点。该方法可以传入css选择器:children(’.ul_tag’)。
html = '''
<div class="div_tag">
<ul id = "ul_tag">
hello I am ul tag
<li>hello I am li tag<a>www.bigdata17.com</li>
<li>hello I am li tag too</li>
</ul>
</div>
'''
doc = pq(html)
print(doc('.div_tag #ul_tag').find("li"))
运行结果:
<li>hello I am li tag<a>www.bigdata17.com</a></li>
<li>hello I am li tag too</li>
使用parent()方法获取当前节点的父亲节点:
html = '''
<div class="div_tag">
<ul id = "ul_tag">
hello I am ul tag
<li>hello I am li tag<a>www.bigdata17.com</li>
<li>hello I am li tag too</li>
</ul>
</div>
'''
doc = pq(html)
print(doc('.div_tag #ul_tag li').parent())
运行结果:
<ul id="ul_tag">
hello I am ul tag
<li>hello I am li tag<a>www.bigdata17.com</a></li>
<li>hello I am li tag too</li>
</ul>
上述代码通过.div_tag #ul_tag li css选择器定位到li节点,然后调用parent()方法获取li节点的父节点ul。
parents()返回当前节点的所有祖宗节点:
html = '''
<div class="div_tag">
<ul id = "ul_tag">
hello I am ul tag
<li>hello I am li tag<a>www.bigdata17.com</li>
<li>hello I am li tag too</li>
</ul>
</div>
'''
doc = pq(html)
print(doc('.div_tag #ul_tag li').parents())
运行结果:
<html><body><div class="div_tag">
<ul id="ul_tag">
hello I am ul tag
<li>hello I am li tag<a>www.bigdata17.com</a></li>
<li>hello I am li tag too</li>
</ul>
</div>
</body></html><body><div class="div_tag">
<ul id="ul_tag">
hello I am ul tag
<li>hello I am li tag<a>www.bigdata17.com</a></li>
<li>hello I am li tag too</li>
</ul>
</div>
</body><div class="div_tag">
<ul id="ul_tag">
hello I am ul tag
<li>hello I am li tag<a>www.bigdata17.com</a></li>
<li>hello I am li tag too</li>
</ul>
</div>
<ul id="ul_tag">
hello I am ul tag
<li>hello I am li tag<a>www.bigdata17.com</a></li>
<li>hello I am li tag too</li>
</ul>
上面代码返回li节点的所有祖宗节点:html,body,div,ul。
siblings()方法返回当前节点的兄弟节点:
html = '''
<div class="div_tag">
<ul id = "ul_tag">
hello I am ul tag
<li class="li_class1">hello I am li tag<a>www.bigdata17.com</li>
<li class="li_class2">hello I am li tag too</li>
<li class="li_class3">hello I am the third li tag</li>
</ul>
</div>
'''
doc = pq(html)
print(doc('.div_tag #ul_tag .li_class1').siblings())
运行结果:
<li class="li_class2">hello I am li tag too</li>
<li class="li_class3">hello I am the third li tag</li>
使用.div_tag #ul_tag .li_class1 CSS节点选择器获取到class为liclassq1的li节点,就是第一个li节点,然后调用siblings()方法获取到子节点,分别是
第二和第三个li节点。
sibligs()还支持传入css选择器筛选符合条件的li节点:
print(doc('.div_tag #ul_tag .li_class1').siblings('.li_class3'))
运行结果:
<li class="li_class3">hello I am the third li tag</li>
总结:本文讲述了如何使用PyQuery获取网页节点,节点的文本信息,改变节点属性,删除节点属性,增加节点属性等知识点。
PyQuery常用用法总结相关推荐
- 一起学爬虫——PyQuery常用用法总结
什么是PyQuery PyQuery是一个类似于jQuery的解析网页工具,使用lxml操作xml和html文档,它的语法和jQuery很像.和XPATH,Beautiful Soup比起来,PyQu ...
- 【Android 异步操作】Handler 机制 ( Handler 常用用法 | HandlerThread 简介 | HandlerThread 源码注释分析 )
文章目录 一.Handler 常用用法 二.HandlerThread 简介 三.HandlerThread 源码 一.Handler 常用用法 主线程 Handler 主要作用 : Looper 和 ...
- 【Android 异步操作】Timer 定时器 ( Timer 与 TimerTask 基本使用 | Timer 定时器常用用法 | Timer 源码分析 )
文章目录 一.Timer 定时器基本使用 二.Timer 定时器常用用法 三.Timer 源码分析 四.Timer 部分源码注释 五.源码及资源下载 参考文档 : Timer 定时器 API 文档 T ...
- 【Kotlin】Kotlin enum 枚举类 ( 常用用法 | 初始化成员变量 | 实现抽象方法 | 实现接口 | 获取名称和位置索引 | 调用枚举常量方法 )
文章目录 I . 枚举类常用用法 II . 枚举类初始化 III. 枚举类匿名类 IV . 枚举类实现接口 V . 获取枚举常量名称和位置索引 VI . 获取枚举常量的成员变量 VII . 调用枚举常 ...
- Python中的基本函数及其常用用法简析
分享Python中的基本函数及其常用用法简析,首先关于函数的解释函数是为了达到某种目的而采取的行为,函数是可重复使用的,用来实现某个单一功能或者功能片段的代码块,简单来说就是由一系列的程序语句组成的程 ...
- 【Data Mining】机器学习三剑客之Numpy常用用法总结
点击"小詹学Python",选择"置顶"公众号 重磅干货,第一时间送达 本文转载自AI蜗牛车,禁二次转载 一.前言 玩数据分析.数据挖掘.AI的都知道这个pyt ...
- grep参数说明及常用用法
grep参数说明及常用用法 查看文件内容 [kou@localhost ~]$ more size.txt b124230 b034325 a081016 m7187998 m7282064 a022 ...
- [转]ssh常用用法小结
ssh常用用法小结 1.连接到远程主机: 命令格式 : ssh name@remoteserver 或者 ssh remoteserver -l name 说明:以上两种方式都可以远程登录到远程主机, ...
- 关于grep,egrep正则表达式的常用用法
正则表达式是一类字符所书写的模式(pattern) 元字符:不表示字符本身的意义,而用于额外功能性的描述:而如果在这些特定的字符前加/这个符号那么这些字符就表示原有的意思. 正则表达式:基本正则表达式 ...
最新文章
- Linux安全事件应急响应排查方法总结
- elk6.3.1版本+metricbeat监控收集swarm的资源使用情况
- git fetch -p 获取远程仓库的新分支以及删除远程仓库已删除的分支
- windows mysql.tar安装_MySQL的安装
- 大学生java项目创意申请表_基于java ee的大学生作品展示系统.pdf
- 实战|Python轻松实现动态网页爬虫(附详细源码)
- 不让自己的应用程序在桌面的图标列表里启动显示的方法
- c语言常用英语单词大全下载,C语言实现英文单词助手
- 为什么不用mysql做数据仓库hdfs_为什么不建议将RAID用于Hadoop HDFS设置?
- 2013.01.16 Python的面向对象编程
- 除了停电之外,今年的CES还有这些“意外”……
- 基于canny的边缘检测算法:
- 海思Hi3798MV100机顶盒芯片介绍
- java23种设计模式
- 28张高清数据分析全知识地图,强烈建议收藏
- unity3d之角色的移动篇 -- 俯视视角下的键盘移动番外篇
- 或是独体字吗_知识:贝是独体字吗什么结构
- 稻城亚丁徒步攻略,与你共同感受这片净土
- 图像处理中的 亮度, 灰度, 对比度等概念
- 89元尝鲜智能家居 天猫精灵方糖智联3件套简评