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实现异步回调机制代码分享
Jan 10 Python
python自动安装pip
Apr 24 Python
Python开发实例分享bt种子爬虫程序和种子解析
May 21 Python
使用grappelli为django admin后台添加模板
Nov 18 Python
python虚拟环境virtualenv的使用教程
Oct 20 Python
Python判断两个list是否是父子集关系的实例
May 04 Python
Flask模板引擎之Jinja2语法介绍
Jun 26 Python
简单了解python filter、map、reduce的区别
Jan 14 Python
pytorch三层全连接层实现手写字母识别方式
Jan 14 Python
用Python爬虫破解滑动验证码的案例解析
May 06 Python
Python爬虫:从m3u8文件里提取小视频的正确操作
May 14 Python
Python音乐爬虫完美绕过反爬
Aug 30 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
PHP实现文件安全下载
2006/10/09 PHP
深入理解PHP之require/include顺序 推荐
2011/01/02 PHP
PHP的preg_match匹配字符串长度问题解决方法
2014/05/03 PHP
php中mysql操作buffer用法详解
2015/03/19 PHP
PHP实现的随机IP函数【国内IP段】
2016/07/20 PHP
用 JSON 处理缓存
2007/04/27 Javascript
ajax处理php返回json数据的实例代码
2013/01/24 Javascript
jquery在IE、FF浏览器的差别详细探讨
2013/04/28 Javascript
JS中引用百度地图并将百度地图的logo和信息去掉
2013/09/29 Javascript
js delete 用法(删除对象属性及变量)
2014/08/24 Javascript
js实现图片漂浮效果的方法
2015/03/02 Javascript
js实现类似新浪微博首页内容渐显效果的方法
2015/04/10 Javascript
Jquery代码实现图片轮播效果(一)
2015/08/12 Javascript
jQuery实现的漂亮表单效果代码
2015/08/18 Javascript
js中substr,substring,indexOf,lastIndexOf,split,replace的用法详解
2015/11/09 Javascript
Bootstrap编写一个兼容主流浏览器的受众门户式风格页面
2016/07/01 Javascript
原生js实现jquery函数animate()动画效果的简单实例
2016/08/21 Javascript
vue.js表格组件开发的实例详解
2016/10/12 Javascript
javascript创建对象的3种方法
2016/11/02 Javascript
webpack file-loader和url-loader的区别
2019/01/15 Javascript
jQuery设置下拉框显示与隐藏效果的方法分析
2019/09/15 jQuery
微信小程序实现左侧滑动导航栏
2020/04/08 Javascript
vue 解决数组赋值无法渲染在页面的问题
2019/10/28 Javascript
简单了解Vue + ElementUI后台管理模板
2020/04/07 Javascript
Taro UI框架开发小程序实现左滑喜欢右滑不喜欢效果的示例代码
2020/05/18 Javascript
python的scikit-learn将特征转成one-hot特征的方法
2018/07/10 Python
Python OOP类中的几种函数或方法总结
2019/02/22 Python
Django单元测试工具test client使用详解
2019/08/02 Python
django ListView的使用 ListView中获取url中的参数值方式
2020/03/27 Python
AP澳洲中文网:澳洲正品直邮,包税收件无忧
2019/07/12 全球购物
计算机专业自荐信
2013/10/14 职场文书
企业行政文员岗位职责
2013/12/03 职场文书
关于热爱祖国的演讲稿
2014/05/04 职场文书
主题团日活动总结
2014/06/25 职场文书
幼儿园教师个人工作总结2015
2015/05/12 职场文书
2015年幼儿教育工作总结
2015/07/24 职场文书