什么是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类:

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方法是否只取第一个复合条件节点的属性值:

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

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()方法就可以实现:

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支持动态给节点添加文本值:

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的.和#来查找节点:

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获取网页节点,节点的文本信息,改变节点属性,删除节点属性,增加节点属性等知识点。

转载于:https://www.cnblogs.com/airnew/p/10056551.html

一起学爬虫——PyQuery常用用法总结相关推荐

  1. PyQuery常用用法总结

    什么是PyQuery PyQuery是一个类似于jQuery的解析网页工具,使用lxml操作xml和html文档,它的语法和jQuery很像.和XPATH,Beautiful Soup比起来,PyQu ...

  2. 零基础如何学爬虫技术?

    路人甲 ,教你如何编程 190 人赞同 第一:Python爬虫学习系列教程(来源于某博主:http://cuiqingcai.com/1052.html) Python版本:2.7 整体目录: 一.爬 ...

  3. 【小白学爬虫连载(1)】-爬虫框架简介

    欢迎大家关注公众号[哈希大数据] [小白学爬虫连载(1)]-爬虫框架简介 [小白学爬虫连载(2)]--Requests库介绍 [小白学爬虫连载(3)]--正则表达式详细介绍 [小白学爬虫连载(4)]- ...

  4. 【小白学爬虫连载(3)】--正则表达式详细介绍

    欢迎大家关注公众号[哈希大数据] [小白学爬虫连载(1)]-爬虫框架简介 [小白学爬虫连载(2)]--Requests库介绍 [小白学爬虫连载(3)]--正则表达式详细介绍 [小白学爬虫连载(4)]- ...

  5. 一木.溪桥学爬虫-03:请求模块urllib、 urllib.request、urllib.parse.urlencode、urllib.parse.quote(str)、.unquote()

    一木.溪桥 在Logic Education跟Jerry学爬虫 07期:Python 爬虫 一木.溪桥学爬虫-03:请求模块urllib. urllib.request.urllib.parse.ur ...

  6. 【0基础学爬虫】爬虫基础之抓包工具的使用

    大数据时代,各行各业对数据采集的需求日益增多,网络爬虫的运用也更为广泛,越来越多的人开始学习网络爬虫这项技术,K哥爬虫此前已经推出不少爬虫进阶.逆向相关文章,为实现从易到难全方位覆盖,特设[0基础学爬 ...

  7. 【0基础学爬虫】爬虫基础之爬虫的基本介绍

    大数据时代,各行各业对数据采集的需求日益增多,网络爬虫的运用也更为广泛,越来越多的人开始学习网络爬虫这项技术,本期为爬虫的基本介绍. 分享一些自己的爬虫项目,学习爬虫一些经验很不错 基于python实 ...

  8. 老司机带你学爬虫——Python爬虫技术分享

    什么是"爬虫"? 简单来说,写一个从web上获取需要数据并按规定格式存储的程序就叫爬虫: 爬虫理论上步骤很简单,第一步获取html源码,第二步分析html并拿到数据.但实际操作,老 ...

  9. 【Data Mining】机器学习三剑客之Numpy常用用法总结

    点击"小詹学Python",选择"置顶"公众号 重磅干货,第一时间送达 本文转载自AI蜗牛车,禁二次转载 一.前言 玩数据分析.数据挖掘.AI的都知道这个pyt ...

最新文章

  1. python使用lassocv生成影像组学(radiomic)模型的系数表
  2. AAA 服务器 — Diameter(直径)协议
  3. 阿里云服务器问题攻略
  4. mysql 慢查询sql实例_Mysql sql慢查询监控脚本代码实例
  5. yaml语法--多行字符串可以使用|保留换行符,也可以使用>折叠换行
  6. java洗牌_java语言实现简单的洗牌,发牌
  7. Android安全笔记-Intent和PendingIntent基本概念
  8. 李迟2021年7月知识总结
  9. 【数据结构----笔记1】查找算法之【顺序查找和折半查找】
  10. c# mvvm模式获取当前窗口_【自学C#】I 书 12 异常处理
  11. 我的世界1.14java原版命令_我的世界:老一辈mc是怎么生存的?鱼骨式挖矿,这些套路你知道吗...
  12. 如何使用scikit-learn工具来进行PCA降维
  13. mysql如何保证数据不丢失_23 | MySQL是怎么保证数据不丢的?
  14. 怎么做好客户关系管理培训PPT课件?
  15. 自动化测试ROI计算器
  16. 在线抽签html,抽签网页板代码
  17. IDEA 获取破解码(注册码)简单破解IDEA
  18. 【springcloud合集】04:新建Moudle——微服务提供者支付模块
  19. 什么是云渲染?为什么要用电脑渲图?
  20. 企业微信号发消息给指定成员

热门文章

  1. 9月4日科技资讯|微信支付二维码被诉侵权;AI 换脸 App「ZAO」致歉; Android 10 正式发布
  2. 百度AI 图片识物/ 图片转文字(JAVA)
  3. Uart接口TTL电平详解
  4. 录取了环境建模专业,准备开始为期一年的学习
  5. linux防火墙firewalld
  6. 论文分析<一>—— ECMP
  7. css3运动框架,CSS3 原子运动
  8. POJ 1664 /NYOJ 758 放苹果问题(递归)
  9. 银河麒麟server v10sp1编译安装php8.1.6
  10. R语言使用plot函数可视化数据散点图,使用font参数指定字体类型为斜体字体(italics)