Python- 玩转数据-PyQuery库_pyquery库的作用_人猿宇宙的博客-程序员宅基地

技术标签: python  后端  python-玩转数据-网络数据采集  开发语言  

Python- 玩转数据-PyQuery库

一、说明

pyquery库是jQuery的Python实现,能够以jQuery的语法来操作解析 HTML 文档,和XPATH,Beautiful Soup比起来,PyQuery更加灵活,提供增加节点的class信息,移除某个节点,提取文本信息等功能
使用lxml操作xml和html文档。

二、初始化PyQuery对象

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

方式一:通过网址初始化PyQyery对象

from pyquery import PyQuery as pq

s = '<html><title>PyQuery用法总结<title></html>'
doc = pq(s)
print(doc('title'))

运行结果:

<title>PyQuery用法总结</title>

PyQuery还会将残缺的html文档补全。看下面的代码:

from pyquery import PyQuery as pq

s = '<html><title>PyQuery用法总结</title>'
doc = pq(s)
print(doc('html'))

运行的结果:

<html><head><title>PyQuery用法总结</title></head></html>

补全了html和head节点

方式二:URL网址初始化PyQyery对象

from pyquery import PyQuery as pq

url = 'http://www.bigdata17.com'
doc = pq(url=url,encoding='utf-8')
print(doc('title'))

运行结果:

<title>Home - Summer哥的自留地</title>

方式三:通过文件初始化PyQyery对象

这个方式也比较常用,很多时候我们会将网站爬取下来然后保存在本地磁盘:

from pyquery import PyQuery as pq

doc = 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属性值

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"/>

动态添加其他属性

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

attr()方法只有一个参数时,是获取节点的属性值,有两个参数时,是给节点添加属性及属性值,第一个参数时属性,第二个参数时属性值。

动态移除节点的class属性removeClass()

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=""/>

动态添加/修改文本值

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

查找节点
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节点。

再看一例子:

html = '''
<div class="wrap">
    <div id="container">
        <ul class="list">
             <li class="item-0">first item</li>
             <li class="item-1"><a href="link2.html">second item</a></li>
             <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></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>
'''
from pyquery import PyQuery as pq
doc = pq(html)
li = doc('li:first-child')
print(li)
li = doc('li:last-child')
print(li)
li = doc('li:nth-child(2)')
print(li)
li = doc('li:gt(2)')
print(li)
li = doc('li:nth-child(2n)')
print(li)
li = doc('li:contains(second)')
print(li)

执行结果:

< li class ="item-0" > first item < / li >
< li class ="item-0" > < a href="link5.html" > fifth item < / a > < / li >
< 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 class ="item-0" > < a href="link5.html" > fifth item < / a > < / li >
< 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 class ="item-1" > < a href="link2.html" > second item < / a > < / 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').children())

运行结果:

<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'))
1

运行结果:

<li class="li_class3">hello I am the third li tag</li>

四、遍历

html = '''
<div class="wrap">
    <div id="container">
        <ul class="list">
             <li class="item-0">first item</li>
             <li class="item-1"><a href="link2.html">second item</a></li>
             <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></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>
'''
from pyquery import PyQuery as pq
doc = pq(html)
lis = doc('li').items()#.items会是一个生成器
print(type(lis))
for li in lis:
    print(li)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/s_unbo/article/details/122857091

智能推荐

How To Avoid ORA-04030/ORA-12500 In 32 Bit Windows Environment [Video] [ID 373602.1]_windows video id_yfleng2002的博客-程序员宅基地

How To Avoid ORA-04030/ORA-12500 In 32 Bit Windows Environment [Video] [ID 373602.1] In this Document Symptoms Cause Solution Reducing Memory =============== Shared Server =_windows video id

安装Anconda,TensorfLow,CUDA与CuDNN_谁捡了我的肥皂的博客-程序员宅基地

一.安装Anconda1.下载Anconda这里我使用的是清华开源镜像下载地址:https://mirrors.tuna.tsinghua.edu.cn/help/anaconda/2.安装Anconda安装很简单,无脑下一步就行。默认安装地址是系统盘,如果想安装到其他盘直接在安装地址栏输入就行。注:不要选择已存在的文件夹,如果选择会报文件已存在无法安装。3.查看是否安...

国内疫情数据可视化平台_国内疫情可视化平台_clearAutumn的博客-程序员宅基地

本系统掌握可视化系统的开发,掌握Django开发web应用,掌握Echarts绘制基本图表,掌握前台页面的布局。_国内疫情可视化平台

优化Visual Studio Code的自动补全_切糕糕的博客-程序员宅基地

Visual Studio Code (简称VS Code)是个很棒的代码编辑器,内置多种语言的自动补全功能,写JavaScript也不例外,VS Code提供的自动补全还是很赞的。不过自动补全功能在有些情况下会失效,比如 document.getElementById() 或 document.querySelector() 返回的对象,是没有自动补全的:就像图中展示的,canvas...

Vue在main.js之前单独引用某个依赖如(element-ui)_banglongchu5551的博客-程序员宅基地

引用Vue并实例化import Vue from 'vue';const v = new Vue();引用// token失效登录过期,强制跳转至登录页axios.interceptors.response.use( response =>{ // token失效登录过期,强制跳转至登录页 if(response.dat...

随便推点

数据结构(七)——Dijkasta 、Flyod、马踏棋盘算法_dijkstra算法 跳棋_快乐是你的与我无关了的博客-程序员宅基地

Dijkstra 算法应用场景-最短路径问题有 7 个村庄(A, B, C, D, E, F, G) ,现在有六个邮差,从 G 点出发,需要分别把邮件分别送到A, B, C , D, E, F 六个村庄各个村庄的距离用边线表示(权) ,比如 A – B 距离 5 公里问:如何计算出 G 村庄到 其它各个村庄的最短距离?如果从其它点出发到各个点的最短距离又是多少?迪杰斯特拉(Dijkstra)算法介绍迪杰斯特拉(Dijkstra)算法是典型最短路径算法,**用于计算一个结点到其他结点的最短路径_dijkstra算法 跳棋

MySql实战篇:写一个简单的存储过程,完成订单定时任务_给新创建的订单添加定时任务_IT实战联盟Lin的博客-程序员宅基地

前言之前我们分享了MySql的性能优化、索引详解等内容,本篇文章主要是针对想要入门MySql存储过程的读者而写的。主要实现的业务是订单库里面的超过30分钟没有支付的订单全部置为失效订单。创建订单表CREATE TABLE `shop_order` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '订单ID', `good_id`int(1..._给新创建的订单添加定时任务

【Flink从入门到精通 01】流式处理概念_编程理想国的博客-程序员宅基地

“Flink中流式处理的概念是实时计算的基石,也是你踏入Flink的第一步。”今天和大家一起聊聊流式处理的通用概念。如果还不清楚这些概念的同学,今天的分享一定会给你带来收获的。关于Flink,之前的《Flink入门安装》可以先看看。01 Flink 是什么在讲流式处理的通用概念之前,我们先引用Flink官网的一段话:Apache Flink is a framework and distributed processing engine for stateful computations ov._flink从入门到精通

二阶段冲刺(八)_weixin_30384217的博客-程序员宅基地

  我想了想,还是放弃了圆点改变——非硬性需求,更重要的是,冲刺快要结束了,先解决选日期的问题。其实主要原因是我昨天做了一天然后失败了。转载于:https://www.cnblogs.com/YXSZ/p/11070129.html...

[转载]JavaScript 图片滑动切换效果_笑的自然的博客-程序员宅基地

在网上看到很多用JavaScript写的图片播放器,有很多写不仅写的代码多,而且还有依赖文件,譬如XML什么的。有的是用Flash来实现的,这样最大的缺陷就是浏览器必须要装上Flash插件,感觉不怎么好,就算现在的浏览器一般都有Flash插件的,整个代码也对Flash产生依赖,很不好。今天看到的这个还真的很不错,高手!学习中。。。在此感谢 “【cloudgamer】——脚步无法到达的地方,目光可以

纯HTML+CSS打造轮播图_简单html+css轮播图_天府第5街①号切图仔的博客-程序员宅基地

本文介绍了如何利用纯HTML+CSS技术,不写一句js代码如何打造轮播图的方法话不多说,先看效果:效果图:代码如下: CSS3仿JS轮播图 > _简单html+css轮播图

推荐文章

热门文章

相关标签