Python网络爬虫神器PyQuery的基本使用教程


Posted in Python onFebruary 03, 2018

前言

pyquery库是jQuery的Python实现,能够以jQuery的语法来操作解析 HTML 文档,易用性和解析速度都很好,和它差不多的还有BeautifulSoup,都是用来解析的。相比BeautifulSoup完美翔实的文档,虽然PyQuery库的文档弱爆了, 但是使用起来还是可以的,有些地方用起来很方便简洁。

安装

关于PyQuery的安装可以参考这篇文章:https://3water.com/article/82955.htm

PyQuery库官方文档

  • 初始化为PyQuery对象
  • 常用的CCS选择器
  • 伪类选择器
  • 查找标签
  • 获取标签信息

初始化为PyQuery对象

html = """
<html lang="en">
 <head>
 简单好用的
 <title>PyQuery</title>
 </head>
 <body>
 <ul id="container">
  <li class="object-1">Python</li>
  <li class="object-2">大法</li>
  <li class="object-3">好</li>
 </ul>
 </body>
</html>
"""

相当于BeautifulSoup库的初识化方法,将html转化为BeautifulSoup对象。

bsObj = BeautifulSoup(html, 'html.parser')

PyQuery库也要有自己的初始化。

1.1 将字符串初始化

from pyquery import PyQuery as pq
#初始化为PyQuery对象
doc = pq(html)
print(type(doc))
print(doc)

返回

<class 'pyquery.pyquery.PyQuery'>

<html lang="en">
 <head>
 <title>PyQuery学习</title>
 </head>
 <body>
 <ul id="container">
  <li class="object-1"/>
  <li class="object-2"/>
  <li class="object-3"/>
 </ul>
 </body>
</html>

1.2 将html文件初始化

#filename参数为html文件路径
test_html = pq(filename = 'test.html')
print(type(test_html))
print(test_html)

返回

<class 'pyquery.pyquery.PyQuery'><html lang="en">
 <head>
 <title>PyQuery学习</title>
 </head>
 <body>
 <ul id="container">
  <li class="object-1"/>
  <li class="object-2"/>
  <li class="object-3"/>
 </ul>
 </body>
</html>

1.3 对网址响应进行初始化

response = pq(url = 'https://www.baidu.com')
print(type(response))
print(response)

返回

<class 'pyquery.pyquery.PyQuery'>

<html> <head><meta http-equiv="content-type" content="text/html;charset=utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=Edge"/><meta content="always" name="referrer"/><link rel="stylesheet" type="text/css" href="https://ss1.bdstatic.com/5eN1bjq8AAUYm2zgoY3K/r/www/cache/bdorz/baidu.min.css" rel="external nofollow" /><title>ç�¾åº¦ä¸�ä¸�ï¼�ä½ å°±ç�¥é��</title></head> <body link="#0000cc"> <div id="wrapper"> <div id="head"> <div class="head_wrapper"> <div class="s_form"> <div class="s_form_wrapper"> <div id="lg"> <img hidefocus="true" src="//www.baidu.com/img/bd_logo1.png" width="270" height="129"/> </div> <form id="form" name="f" action="//www.baidu.com/s" class="fm"> <input type="hidden" name="bdorz_come" value="1"/> <input type="hidden" name="ie" value="utf-8"/> <input type="hidden" name="f" value="8"/> <input type="hidden" name="rsv_bp" value="1"/> <input type="hidden" name="rsv_idx" value="1"/> <input type="hidden" name="tn" value="baidu"/><span class="bg s_ipt_wr"><input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off" autofocus="autofocus"/></span><span class="bg s_btn_wr"><input type="submit" id="su" value="ç�¾åº¦ä¸�ä¸�" class="bg s_btn" autofocus=""/></span> </form> </div> </div> <div id="u1"> <a href="http://news.baidu.com" rel="external nofollow" name="tj_trnews" class="mnav">æ�°é�»</a> <a href="https://www.hao123.com" rel="external nofollow" name="tj_trhao123" class="mnav">hao123</a> <a href="http://map.baidu.com" rel="external nofollow" name="tj_trmap" class="mnav">å�°å�¾</a> <a href="http://v.baidu.com" rel="external nofollow" name="tj_trvideo" class="mnav">è§�é¢�</a> <a href="http://tieba.baidu.com" rel="external nofollow" name="tj_trtieba" class="mnav">è´´å�§</a> <noscript> <a href="http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1" rel="external nofollow" name="tj_login" class="lb">ç�»å½�</a> </noscript> <script>document.write('<a href="http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u='+ encodeURIComponent(window.location.href+ (window.location.search === " rel="external nofollow" " ? "?" : "&")+ "bdorz_come=1")+ '" name="tj_login" class="lb">ç�»å½�</a>');
</script> <a href="//www.baidu.com/more/" rel="external nofollow" name="tj_briicon" class="bri" style="display: block;">æ�´å¤�产å��</a> </div> </div> </div> <div id="ftCon"> <div id="ftConw"> <p id="lh"> <a href="http://home.baidu.com" rel="external nofollow" >å
³äº�ç�¾åº¦</a> <a href="http://ir.baidu.com" rel="external nofollow" >About Baidu</a> </p> <p id="cp">©2017 Baidu <a href="http://www.baidu.com/duty/" rel="external nofollow" >使ç�¨ç�¾åº¦å��å¿
读</a> <a href="http://jianyi.baidu.com/" rel="external nofollow" class="cp-feedback">����</a> 京ICP�030173� <img src="//www.baidu.com/img/gs.gif"/> </p> </div> </div> </div> </body> </html>

二、常用的CCS选择器

打印id为container的标签

print(doc('#container'))
print(type(doc('#container')))

返回

<ul id="container">
 <li class="object-1"/>
 <li class="object-2"/>
 <li class="object-3"/>
</ul>

<class 'pyquery.pyquery.PyQuery'>

打印class为object-1的标签

print(doc('.object-1'))

返回

<li class="object-1"/>

打印标签名为body的标签

print(doc('body'))

返回

<body>
 <ul id="container">
 <li class="object-1"/>
 <li class="object-2"/>
 <li class="object-3"/>
 </ul>
</body>

多种css选择器使用

print(doc('html #container'))

返回

<ul id="container">
 <li class="object-1"/>
 <li class="object-2"/>
 <li class="object-3"/>
</ul>

三、伪类选择器

伪类nth

print(pseudo_doc('li:nth-child(2)'))
#打印第一个li标签
print(pseudo_doc('li:first-child'))
#打印最后一个标签
print(pseudo_doc('li:last-child'))

返回

<li class="object-2">大法</li>
<li class="object-1">Python</li>
<li class="object-6">好玩</li>

contains

#找到含有Python的li标签
print(pseudo_doc("li:contains('Python')"))
#找到含有好的li标签
print(pseudo_doc("li:contains('好')"))

返回

<li class="object-1">Python</li>
<li class="object-3">好</li>
<li class="object-4">好</li>
<li class="object-6">好玩</li>

四、查找标签

按照条件在Pyquery对象中查找符合条件的标签,类似于BeautifulSoup中的find方法。

打印id=container的标签

print(doc.find('#container'))

返回

<ul id="container">
 <li class="object-1"/>
 <li class="object-2"/>
 <li class="object-3"/>
</ul>
print(doc.find('li'))

返回

<li class="object-1"/>
<li class="object-2"/>
<li class="object-3"/>

4.2 子辈标签-children方法

#id=container的标签的子辈标签
container = doc.find('#container')
print(container.children())

返回

<li class="object-1"/>
<li class="object-2"/>
<li class="object-3"/>

4.3 父辈标签-parent方法

object_2 = doc.find('.object-2')
print(object_2.parent())

返回

<ul id="container">
 <li class="object-1"/>
 <li class="object-2"/>
 <li class="object-3"/>
</ul>

4.4 兄弟标签-siblings方法

object_2 = doc.find('.object-2')
print(object_2.siblings())

返回

<li class="object-1"/>
<li class="object-3"/>

五、获取标签的信息

定位到目标标签后,我们需要标签内部的文本或者属性值,这时候需要进行提取文本或属性值操作

5.1 标签属性值的提取

.attr() 传入 标签的属性名,返回属性值

object_2 = doc.find('.object-2')
print(object_2.attr('class'))

返回

object-2

5.2 标签内的文本

.text()

html_text = """
<html lang="en">
 <head>
  简单好用的
  <title>PyQuery</title>
 </head>
 <body>
  <ul id="container">
   Hello World!
   <li class="object-1">Python</li>
   <li class="object-2">大法</li>
   <li class="object-3">好</li>
  </ul>
 </body>
</html>
"""
docs = pq(html_text)
print(docs.text())

返回

简单好用的 PyQuery Hello World! Python 大法 好
object_1 = docs.find('.object-1')
print(object_1.text())
container = docs.find('#container')
print(container.text())

返回

Python

Hello World! Python 大法 好

tips:如果我只想获得Hello World这个,不想得到其他的文本,可以使用remove方法将li标签去掉,然后再使用text方法

container = docs.find('#container')
container.remove('li')
print(container.text())

返回

Hello World!

pyquery一些自定义的用法

访问网址

PyQuery与BeautifulSoup对比,我们会发现PyQuery可以对网址发起请求。 比如

from pyquery import PyQuery
PyQuery(url = 'https://www.baidu.com')

opener参数

这是PyQuery对百度网址进行请求,并将请求返回的响应数据处理为PyQuery对象。一般pyquery库会默认调用urllib库,如果想使用selenium或者requests库,可以自定义PyQuery的opener参数。

opener参数作用是告诉pyquery用什么请求库对网址发起请求。常见的请求库如urllib、requests、selenium。这里我们自定义一个selenium的opener。

from pyquery import PyQuery
from selenium.webdriver import PhantomJS
#用selenium访问url
def selenium_opener(url):
 #我没有将Phantomjs放到环境变量,所以每次用都要放上路径
 driver = PhantomJS(executable_path = 'phantomjs的路径')
 driver.get(url)
 html = driver.page_source
 driver.quit()
 return html
#注意,使用时opener参数是函数名,没有括号的!
PyQuery(url='https://www.baidu.com/', opener=selenium_opener)

这时候我们就能对PyQuery对象进行操作,提取有用的信息。具体请看上次的分享,如果想了解更多的功能,pyquery文档写的不怎么详细,好在基本跟jQuery功能吻合,我们如果想用好pyquery,需要查看jQuery文档。

cookies、headers

在requests用法中,一般为了访问网址更加真实,模仿成浏览器。一般我们需要传入headers,必要的时候还需要传入cookies参数。而pyquery库就有这功能,也能伪装浏览器。

from pyquery import PyQuery
cookies = {'Cookie':'你的cookie'}
headers = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36'}
PyQuery(url='https://www.baidu.com/',headers=headers,cookies=cookies)

让你的selenium带上pyquery功能

让driver访问的网址得到的网页直接变为PyQuery对象,更方便提取数据

from pyquery import PyQuery
from selenium.webdriver import PhantomJS
class Browser(PhantomJS):
 @property 
 def dom(self):
  return PyQuery(self.page_source)"""
这部分property是装饰器,需要知道@property下面紧跟的函数,实现了类的属性功能。
这里browser.dom,就是browser的dom属性。
"""
browser = Browser(executable_path='phantomjs的路径')
browser.get(url='https://www.baidu.com/')
print(type(browser.dom))

返回

<class 'pyquery.pyquery.PyQuery'>

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
Python多线程经典问题之乘客做公交车算法实例
Mar 22 Python
python引入导入自定义模块和外部文件的实例
Jul 24 Python
python基础教程项目三之万能的XML
Apr 02 Python
python 利用pandas将arff文件转csv文件的方法
Feb 12 Python
python抖音表白程序源代码
Apr 07 Python
python 计算平均平方误差(MSE)的实例
Jun 29 Python
python交互模式基础知识点学习
Jun 18 Python
详解python 内存优化
Aug 17 Python
python 利用jieba.analyse进行 关键词提取
Dec 17 Python
python爬取代理ip的示例
Dec 18 Python
关于python中remove的一些坑小结
Jan 04 Python
Python中的datetime包与time包包和模块详情
Feb 28 Python
numpy.random.seed()的使用实例解析
Feb 03 #Python
Python网络爬虫中的同步与异步示例详解
Feb 03 #Python
Python模块文件结构代码详解
Feb 03 #Python
Python处理文本换行符实例代码
Feb 03 #Python
Python断言assert的用法代码解析
Feb 03 #Python
Python下载网络小说实例代码
Feb 03 #Python
JS设计模式之责任链模式实例详解
Feb 03 #Python
You might like
phpmyadmin3 安装配置图解教程
2012/03/29 PHP
phpmailer发送gmail邮件实例详解
2013/06/24 PHP
PHP获取路径和目录的方法总结【必看篇】
2017/03/04 PHP
PHP基于双向链表与排序操作实现的会员排名功能示例
2017/12/26 PHP
django中的ajax组件教程详解
2018/10/18 PHP
用倒置滤镜把div倒置,再把table倒置。
2007/07/31 Javascript
js冒泡法和数组转换成字符串示例代码
2013/08/14 Javascript
js获取指定日期前后的日期代码
2013/08/20 Javascript
单元选择合并变色示例代码
2014/05/26 Javascript
JS实现文字向下滚动完整实例
2015/02/06 Javascript
动态更新highcharts数据的实现方法
2016/05/28 Javascript
浅谈JavaScript 浏览器对象
2016/06/03 Javascript
微信小程序 UI布局常用技巧整理总结
2016/12/05 Javascript
使用AngularJS2中的指令实现按钮的切换效果
2017/03/27 Javascript
Vuex之理解Getters的用法实例
2017/04/19 Javascript
解决vue处理axios post请求传参的问题
2018/03/05 Javascript
laydate只显示时分 不显示秒的功能实现方法
2019/09/28 Javascript
详解如何在JS代码中消灭for循环
2019/12/11 Javascript
[05:00]第二届DOTA2亚洲邀请赛主赛事第三天比赛集锦.mp4
2017/04/04 DOTA
Python基于动态规划算法计算单词距离
2015/07/25 Python
Saltstack快速入门简单汇总
2016/03/01 Python
Python用户推荐系统曼哈顿算法实现完整代码
2017/12/01 Python
Python实现的序列化和反序列化二叉树算法示例
2019/03/02 Python
Python脚本修改阿里云的访问控制列表的方法
2019/03/08 Python
python对文件目录的操作方法实例总结
2019/06/24 Python
django 实现后台从富文本提取纯文本
2020/07/02 Python
CSS3移动端vw+rem不依赖JS实现响应式布局的方法
2019/01/23 HTML / CSS
Java语言的优势
2015/01/10 面试题
运动会入场词50字
2014/02/20 职场文书
优秀大学生自荐信
2014/06/09 职场文书
公司证明怎么写
2014/09/22 职场文书
2015年员工试用期工作总结
2014/12/12 职场文书
优秀大学生事迹材料
2014/12/24 职场文书
民间借贷纠纷答辩状
2015/08/03 职场文书
2016简历自荐信优秀范文
2016/01/29 职场文书
HTML5页面打开微信小程序功能实现
2022/09/23 HTML / CSS