爬虫神器PyQuery的使用方法


发布时间:2018-02-22      来源:互联网

苟日新,日日新

对于Python,每天不学新的就觉得这一天没啥意思。如果不温故一下,过几天就又忘了,白学了是一件很没劲的事情。要学新东西,也要温故旧日所学,才能不断进步。很久之前就知道PyQuery库,但是学会了BeautifulSoup库,整个人就进入舒适区,不想使用新的解析库写爬虫,整个人也没啥更新了。从今天开始,以后再写爬虫,尽量换换写法。

今天我看了Pyquery相关教程,发现PyQuery库。 相比BeautifulSoup完美翔实的文档,虽然PyQuery库的文档弱爆了, 但是使用起来还是可以的,有些地方用起来很方便简洁,因此还是决定学习一下, 特地在此记录下来,分享今日所学。

PyQuery库简洁

pyquery库是jQuery的Python实现,能够以jQuery的语法来操作解析 HTML 文档,易用性和解析速度都很好。

PyQuery库官方文档

本文章节:

1.初始化为PyQuery对象

2.常用的CCS选择器

3.伪类选择器

4.查找标签

5.获取标签信息

一、初始化为PyQuery对象 html = """ <html><head>简单好用的 <title>PyQuery </title></head><body><ulid="container"><li>Python </li><li>大法 </li><li></li></ul></body></html>"""

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

bsObj = BeautifulSoup(html, ‘html.parser’)

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

1.1 将字符串初始化 from pyquery import PyQuery as pq #初始化为PyQuery对象doc = p q(html)print(type(doc)) print(doc)

返回

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

我这里准备了一份html文件,我们也可以使用pyquery将html文件初始化。

1.2 将html文件初始化 #filename参数为html文件路径test_html = p q(filename = 'test.html')print(type(test_html)) print(test_html)

返回

<class'pyquery.pyquery.PyQuery'><htmllang="en"><head><title>PyQuery学习 </title></head><body><ulid="container"><liclass="object-1"/><liclass="object-2"/><liclass="object-3"/></ul></body></html>1.3 对网址响应进行初始化 response = p q(url = 'https://www.baidu.com')print(type(response)) print(response)

返回

<class'pyquery.pyquery.PyQuery'><html><head><metahttp-equiv="content-type"content="text/html;charset=utf-8"/><metahttp-equiv="X-UA-Compatible"content="IE=Edge"/><metacontent="always"name="referrer"/><linkrel="stylesheet"type="text/css"href="https://ss1.bdstatic.com/5eN1bjq8AAUYm2zgoY3K/r/www/cache/bdorz/baidu.min.css"/><title>ç™¾åº¦ä¸€ä¸‹ï¼Œä½ å°±çŸ¥é“ </title></head><bodylink="#0000cc"><divid="wrapper"><divid="head"><divclass="head_wrapper"><divclass="s_form"><divclass="s_form_wrapper"><divid="lg"><imghidefocus="true"src="//www.baidu.com/img/bd_logo1.png"width="270"height="129"/></div><formid="form"name="f"action="//www.baidu.com/s"class="fm"><inputtype="hidden"name="bdorz_come"value="1"/><inputtype="hidden"name="ie"value="utf-8"/><inputtype="hidden"name="f"value="8"/><inputtype="hidden"name="rsv_bp"value="1"/><inputtype="hidden"name="rsv_idx"value="1"/><inputtype="hidden"name="tn"value="baidu"/><spanclass="bg s_ipt_wr"><inputid="kw"name="wd"class="s_ipt"value=""maxlength="255"autocomplete="off"autofocus="autofocus"/></span><spanclass="bg s_btn_wr"><inputtype="submit"id="su"value="百度一下"class="bg s_btn"autofocus=""/></span></form></div></div><divid="u1"><ahref="http://news.baidu.com"name="tj_trnews"class="mnav">æ–°é—» </a><ahref="https://www.hao123.com"name="tj_trhao123"class="mnav">hao123 </a><ahref="http://map.baidu.com"name="tj_trmap"class="mnav">地图 </a><ahref="http://v.baidu.com"name="tj_trvideo"class="mnav">视频 </a><ahref="http://tieba.baidu.com"name="tj_trtieba"class="mnav">贴吧 </a><no><ahref="http://www.baidu.com/bdorz/login.gif?login&amp;tpl=mn&amp;u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1"name="tj_login"class="lb">登录 </a></no><>document.write('&lt;a href="http://www.baidu.com/bdorz/login.gif?login&amp;tpl=mn&amp;u='+ encodeURIComponent(window.location.href+ (window.location.search === ""? "?": "&amp;")+ "bdorz_come=1")+ '" name="tj_login"&gt;登录&lt;/a&gt;');&#13;</><ahref="//www.baidu.com/more/"name="tj_briicon"class="bri"style="display: block;">更多产品 </a></div></div></div><divid="ftCon"><divid="ftConw"><pid="lh"><ahref="http://home.baidu.com">关于百度 </a><ahref="http://ir.baidu.com">About Baidu </a></p><pid="cp">©2017 Baidu <ahref="http://www.baidu.com/duty/">使用百度前必读 </a><ahref="http://jianyi.baidu.com/"class="cp-feedback">意见反馈 </a>京ICP证030173号 <imgsrc="//www.baidu.com/img/gs.gif"/></p></div></div></div></body></html>二、常用的CCS选择器

从这一节开始,我们就要对PyQuery对象进行操作,获得我们想要的各种数据。你会看到解析网页,不论什么苦,基本原理实际上是没有区别的,学会了一种解析库。再看其他解析库文档,是很容易理解的。

在 CSS 中,选择器是一种模式,用于选择需要添加样式的元素。

常用的css选择器

css选择器 例子 解释 .clas .intro 选择 的所有元素。 id firstname 选择 id=”firstname” 的所有元素。 * * 选择所有元素 element p 选择所有p标签元素 element element div p 选择 div 标签内部的所有 p 标签 [attribute] [target] 选择带有 target 属性所有标签 [attribute=value] [target=_blank] 选择 target=”_blank” 的所有标签

本文只讲clas id 和element最常见的css选择器。对css不太懂了,也没关系,可以去

w3c的css选择器

查看下文档

#使用上文的docprint(doc)

返回

<htmllang="en"><head><title>PyQuery学习 </title></head><body><ulid="container"><liclass="object-1"/><liclass="object-2"/><liclass="object-3"/></ul></body></html>

打印id为container的标签

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

返回

<ulid="container"><liclass="object-1"/><liclass="object-2"/><liclass="object-3"/></ul><class'pyquery.pyquery.PyQuery'>

打印class为object-1的标签

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

返回

<li class= "object-1"/>

打印标签名为body的标签

print(doc('body'))

返回

<body><ulid="container"><liclass="object-1"/><liclass="object-2"/><liclass="object-3"/></ul></body>

多种css选择器使用

print(doc('html #container'))

返回

<ulid="container"><liclass="object-1"/><liclass="object-2"/><liclass="object-3"/></ul>

注意多种css选择器使用,#container不一定必须是html的子标签,实际上可以是孙子、重孙等层级的标签

三、伪类选择器 css选择器 例子 解释 :nth-child(n) p:nth-child(2) 找到第二个p标签 :first-child p:first-child 找到第一个p标签 :last-child p:last-child 找到最后一个p标签 :gt(n) p:gt(2) 找到第二个以后标签 :lt(n) p:lt(5) 找到第5个以前标签 :contains() p:contains(‘second’) 找到包含second文本的p标签 pseudo_html = """ <html><head>简单好用的 <title>PyQuery </title></head><body><ulid="container"><li>Python </li><li>大法 </li><li></li><li></li><li>好玩 </li></ul></body></html>""" pseudo_doc = pq(pseudo_html) print(pseudo_doc)

返回

<htmllang="en"><head>简单好用的 <title>PyQuery </title></head><body><ulid="container"><liclass="object-1">Python </li><liclass="object-2">大法 </li><liclass="object-3"></li><liclass="object-4"></li><liclass="object-6">好玩 </li></ul></body></html>

伪类nth

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

返回

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

contains

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

返回

<liclass="object-1">Python </li><liclass="object-3"></li><liclass="object-4"></li><liclass="object-6">好玩 </li>四、查找标签

•find方法

•子辈标签-children方法

•父辈标签-parent方法

•兄弟标签-siblings方法

4.1 find方法

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

find()中传入css选择器

print(doc)

返回

<htmllang="en"><head><title>PyQuery学习 </title></head><body><ulid="container"><liclass="object-1"/><liclass="object-2"/><liclass="object-3"/></ul></body></html>

打印id=container的标签

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

返回

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

返回

<liclass="object-1"/><liclass="object-2"/><liclass="object-3"/>4.2 子辈标签-children方法 #id= container的标签的子辈标签 container= doc.find( '#container') print( container.children())

返回

<liclass="object-1"/><liclass="object-2"/><liclass="object-3"/>4.3 父辈标签-parent方法 object_2 = doc.find( '.object-2') print(object_2. parent())

返回

<ulid="container"><liclass="object-1"/><liclass="object-2"/><liclass="object-3"/></ul>4.4 兄弟标签-siblings方法 object_2 = doc.find( '.object-2') print(object_2.siblings())

返回

<liclass="object-1"/><liclass="object-3"/>五、获取标签的信息

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

5.1 标签属性值的提取

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

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

返回

object- 25.2 标签内的文本

.text()

html_text = """ <html><head>简单好用的 <title>PyQuery </title></head><body><ulid="container">Hello World! <li>Python </li><li>大法 </li><li></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!

我有一个Python学习交流QQ群:638121273 禁止闲聊,非喜勿进。