Python网络爬虫学习笔记(十):PyQuery库的使用
文章目录
- 1.初始化
- 1.1 字符串初始化
- 1.2 URL初始化
- 1.3 文件初始化
- 2.CSS选择器
- 3.查找节点
- 3.1 子节点
- 3.2 父节点
- 3.3 兄弟节点
- 遍历
- 4.获取信息
- 4.1 获取属性
- 4.2 获取文本
- 5.节点操作
1.初始化
1.1 字符串初始化
引入PyQuery对象,取别名为pq。声明一个HTML字符串,并将其当作参数传递给PyQuery类,这样就成功完成了初始化。传入li节点,这样就可以选择所有的li节点:
from pyquery import PyQuery as pqhtml = '''
<div><ul><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>
'''
doc = pq(html)
print(type(doc))
print(doc)
print(doc('li'))
<class 'pyquery.pyquery.PyQuery'>
<div><ul><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>
<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>
1.2 URL初始化
指定参数url
初始化:
from pyquery import PyQuery as pq
doc = pq(url = 'http://cuiqingcai.com')
print(doc('title'))
<title>静觅丨崔庆才的个人博客</title>
1.3 文件初始化
传递本地的文件名,此时将参数指定为filename
:
from pyquery import PyQuery as pq
doc = pq(filename='demo.html')
print(doc('li'))
2.CSS选择器
html = '''
<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>
'''
from pyquery import PyQuery as pq
doc = pq(html)
print(doc('#container .list li'))
print(type(doc('#container .list li')))
<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><class 'pyquery.pyquery.PyQuery'>
这里我们初始化PyQuery
对象之后,传入了一个CSS选择器#container .list li
,它的意思是先选取id为container
的节点,然后再选取其内部的class
为list
的节点内部的所有li
节点。然后,打印输出
3.查找节点
3.1 子节点
查找子节点时,需要用到find()方法,此时传入的参数是CSS选择器:
from pyquery import PyQuery as pq
doc = pq(html)
items = doc('.list')
print(type(items))
print(items)
lis = items.find('li')
print(type(lis))
print(lis)
<class 'pyquery.pyquery.PyQuery'>
<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><class 'pyquery.pyquery.PyQuery'>
<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>
find()
的查找范围是节点的所有子孙节点,而如果我们只想查找子节点,那么可以用children()
方法:
lis = items.children()
print(type(lis))
print(lis)
<class 'pyquery.pyquery.PyQuery'>
<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>
如果要筛选所有子节点中符合条件的节点,比如想筛选出子节点中class
为active
的节点,可以向children()
方法传入CSS选择器.active
:
lis = items.children('.active')
print(lis)
<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>
3.2 父节点
我们可以使用parent()
方法来获取某个节点的父节点:
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)
items = doc('.list')
container = items.parent()
print(type(container))
print(container)
<class 'pyquery.pyquery.PyQuery'>
<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>
可以使用parents()
方法获取所有的祖先节点
from pyquery import PyQuery as pq
doc = pq(html)
items = doc('.list')
parents = items.parents()
print(type(parents))
print(parents)
<class 'pyquery.pyquery.PyQuery'>
<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><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>
向parents()
方法传入CSS选择器筛选某个祖先节点:
parent = items.parents('.wrap')
print(parent)
<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>
3.3 兄弟节点
使用siblings()
方法获取兄弟节点:
from pyquery import PyQuery as pq
doc = pq(html)
li = doc('.list .item-0.active')
print(li.siblings())
<li class="item-1"><a href="link2.html">second item</a></li><li class="item-0">first item</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>
向siblings
方法传入CSS选择器筛选某个兄弟节点:
from pyquery import PyQuery as pq
doc = pq(html)
li = doc('.list .item-0.active')
print(li.siblings('.active'))
<li class="item-1 active"><a href="link4.html">fourth item</a></li>
遍历
对于多个节点的结果,需要遍历来获取。例如,这里把每一个li节点进行遍历,需要调用items()方法:
from pyquery import PyQuery as pq
doc = pq(html)
lis = doc('li').items()
print(type(lis))
for li in lis:print(li, type(li))
<class 'generator'>
<li class="item-0">first item</li><class 'pyquery.pyquery.PyQuery'>
<li class="item-1"><a href="link2.html">second item</a></li><class 'pyquery.pyquery.PyQuery'>
<li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li><class 'pyquery.pyquery.PyQuery'>
<li class="item-1 active"><a href="link4.html">fourth item</a></li><class 'pyquery.pyquery.PyQuery'>
<li class="item-0"><a href="link5.html">fifth item</a></li><class 'pyquery.pyquery.PyQuery'>
4.获取信息
4.1 获取属性
调用attr()
方法来获取属性:
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)
a = doc('.item-0.active a')
print(a, type(a))
print(a.attr('href'))
<a href="link3.html"><span class="bold">third item</span></a> <class 'pyquery.pyquery.PyQuery'>
link3.html
此外,也可以通过调用attr
属性来获取属性,用法如下:
print(a.attr.href)
link3.html
如果选中的是多个元素,然后调用attr()方法,只会得到第一个节点的属性:
a = doc('a')
print(a, type(a))
print(a.attr('href'))
print(a.attr.href)
<a href="link2.html">second item</a><a href="link3.html"><span class="bold">third item</span></a><a href="link4.html">fourth item</a><a href="link5.html">fifth item</a> <class 'pyquery.pyquery.PyQuery'>
link2.html
link2.html
遇到这种情况时,如果想获取所有的a节点的属性,就要用到前面所说的遍历了:
from pyquery import PyQuery as pq
doc = pq(html)
a = doc('a')
for item in a.items():print(item.attr('href'))
link2.html
link3.html
link4.html
link5.html
4.2 获取文本
可以调用text()
方法来实现:
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)
a = doc('.item-0.active a')
print(a)
print(a.text())
<a href="link3.html"><span class="bold">third item</span></a>
third item
但如果想要获取这个节点内部的HTML文本,就要用html()
方法了:
from pyquery import PyQuery as pq
doc = pq(html)
li = doc('.item-0.active')
print(li)
print(li.html())
<li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li><a href="link3.html"><span class="bold">third item</span></a>
如果我们选中的结果是多个节点,text()或html()会返回什么内容?我们用实例来看一下:
html = '''
<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"><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')
print(li.html())
print(li.text())
print(type(li.text()))
<a href="link2.html">second item</a>
second item third item fourth item fifth item
<class 'str'>
html()
方法返回的是第一个li
节点的内部HTML文本,而text()
则返回了所有的li节点内部的纯文本,中间用一个空格分割开,即返回结果是一个字符串。
5.节点操作
addClass
和removeClass
:
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('.item-0.active')
print(li)
li.removeClass('active')
print(li)
li.addClass('active')
print(li)
<li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li><li class="item-0"><a href="link3.html"><span class="bold">third item</span></a></li><li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
首先选中了第三个li节点,然后调用removeClass()
方法,将li
节点的active
这个class
移除,后来又调用addClass()
方法,将class
添加回来。每执行一次操作,就打印输出当前li
节点的内容。
除了操作class
这个属性外,也可以用attr()
方法对属性进行操作。此外,还可以用text()
和html()
方法来改变节点内部的内容。示例如下:
html = '''
<ul class="list"><li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
</ul>
'''
from pyquery import PyQuery as pq
doc = pq(html)
li = doc('.item-0.active')
print(li)
li.attr('name', 'link')
print(li)
li.text('changed item')
print(li)
li.html('<span>changed item</span>')
print(li)
<li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li><li class="item-0 active" name="link"><a href="link3.html"><span class="bold">third item</span></a></li><li class="item-0 active" name="link">changed item</li><li class="item-0 active" name="link"><span>changed item</span></li>
Python网络爬虫学习笔记(十):PyQuery库的使用相关推荐
- python网络爬虫学习笔记(6)动态网页抓取(一)知识
文章目录 网络爬虫学习笔记(2) 1 资料 2 笔记 2-1 动态抓取概述 2-2 通过浏览器审查元素解析真实网页地址 2-3 网页URL地址的规律 2-4 json库 2-5 通过Selenium模 ...
- python网络爬虫学习笔记(7)动态网页抓取(二)实践
文章目录 1 资料 2 笔记 2-1 准备 2-1-1. 网址 2-2-2 文本位置 2-2 代码 2-2-1 原型 2-2-2 ver0.1 1 资料 <Python网络爬虫从入门到实践> ...
- Python网络爬虫学习笔记(二)基本库的使用
基本库的使用 最基础的 HTTP 库有 urllib . httplib2 . requests . treq 等 . 使用urlib urlib 包含四个模块 口 request : 它是最基本的 ...
- python 网络爬虫学习笔记(一)
为了方便,在Windows下我用了PyCharm,个人感觉这是一款优秀的python学习软件.爬虫,即网络爬虫,大家可以理解为在网络上爬行的一直蜘蛛,互联网就比作一张大网,而爬虫便是在这张网上爬来爬去 ...
- python网络爬虫学习笔记(十):数据存储
文章目录 1.文本存储 2.JSON文件存储 2.1 读取JOSN 2.2 输出JSON 3.CSV文件存储 3.1 写入 3.2 读取 1.文本存储 import requests from pyq ...
- python网络爬虫学习笔记(三):urllib库的使用
文章目录 使用urllib库 1.urllib.request.urlopen()函数 urlopen()函数API: 2.urllib.request函数 验证 Cookies 保存Cookies ...
- python网络爬虫学习笔记(六):Requests库的使用
文章目录 1.基础操作 1.1 GET请求 1.2 post请求 1.3 响应 2.高级用法 1.1 文件上传 2.2 Cookies 2.3 会话维持 2.4 SSL证书验证 2.5 代理设置 2. ...
- python网络爬虫学习笔记(五):urllib.parse库
urllib.parse库定义了处理URL的标准接口,例如实现URL各部分的抽取.合并以及链接转换.它支持如下协议的URL处理:file.ftp.gopher.hdl.http.https等. 1.u ...
- python网络爬虫学习笔记(二):爬虫基本概述
1.爬虫的基本概述 (1) 获取网页 爬虫首先要做的工作就是获取网页,这里就是获取网页的源代码.源代码里包含了网页的部分有用信息,所以只要把源代码获取下来,就可以从中提取想要的信息了. python提 ...
最新文章
- 槽点才是G点,LiveVideoStack主编是如何吐槽内容的?
- 线性代数(矩阵、高斯、线性基……)
- 使用 Python 获取 Linux 系统信息的代码
- micropython编译原理_C语言嵌入式Linux高级编程第9期:CPU和操作系统入门视频课程...
- 阿里云服务器配置开发环境第五章:Centos7.3切换为iptables防火墙
- 第二章----基本语法
- Hive Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient
- iometer - 性能压力测试工具
- php 判断是否为360浏览器,怎么判断浏览器是否是360浏览器
- CSS3 旋转木马图片动画(transform+Animation)
- PHP中smart原则,SMART原则的五大原则是什么
- 网络安全笔记-14-网络层-路由
- word2019技巧:段落的段前段后单位行设置为磅
- 语料库语言学与计算语言学研究丛书
- 什么是IP地址冲突?如何解决IP地址冲突?
- QtVtk-009-Cone4
- 微信扫码登录网页实现思路
- javascript【写法规范】
- 中级育婴师证怎么考,需要些什么条件
- wgt文件怎么安装到手机_uni-app开发经验分享十二: Android平台应用启动时读写手机存储、访问设备信息(如IMEI)等权限策略及提示信息...
热门文章
- 你觉得sql有多难?
- asp.net 页面数据导入word模板
- c# asp.net 2.0 tableadapter 动态 dynamic sql语句
- 学习笔记(01):Oracle数据库-Oracle安装与配置
- httpClient测试
- 8.0系统机器激活XPOSED框架失败The Xposed framework is not installed
- C语言,产生一组数字,并将其写入txt文档中
- 什么是数据库并发控制?数据库并发控制的主要方法是?
- python collections,函数等笔记
- 面向对象的JavaScript-007-Function.prototype.bind() 的4种作用