【Python】爬虫PyQuery使用详解

1.安装方法

pip install pyquery

2.引用方法

from pyquery import PyQuery as pq

3.简介

pyquery 是类型jquery 的一个专供python使用的html解析的库,使用方法类似bs4。

4.使用方法
4.1 网址响应初始化方法:
from pyquery import PyQuery as pq
doc =pq(html)                              #解析html字符串
doc =pq(url = "http://news.baidu.com/")    #解析网页
doc =pq("./a.html")                        #解析html 文本
4.2 html()和text() ——获取相应的HTML块或文本
doc=pq("<head><title>hello</title></head>")

doc('head').html()    #返回<title>hello</title>
doc('head').text()    #返回hello
4.3 根据HTML标签来获取元素:
doc=pq('<div><p>test 1</p><p>test 2</p></div>')

doc('p')                 #返回[<p>,<p>]
print doc('p')           #返回<p>test 1</p><p>test 2</p>
print doc('p').html()    #返回test 1

注意:当获取到的元素不只一个时,html()、text()方法只返回首个元素的相应内容块

4.4 eq(index) ——根据给定的索引号得到指定元素

–>接上例,若想得到第二个p标签内的内容,则可以

print doc('p').eq(1).html()     #返回test 2
4.5 filter() ——根据类名、id名得到指定元素
doc=pq("<div><p id='1'>test 1</p><p class='2'>test 2</p></div>")

doc('p').filter('#1')     #返回[<p#1>]
doc('p').filter('.2')     #返回[<p.2>]
4.6 find() ——查找嵌套元素
doc=pq("<div><p id='1'>test 1</p><p class='2'>test 2</p></div>")

doc('div').find('p')          #返回[<p#1>, <p.2>]
doc('div').find('p').eq(0)    #返回[<p#1>]
4.7 直接根据类名、id名获取元素

在这里插入图片描述

doc=pq("<div><p id='1'>test 1</p><p class='2'>test 2</p></div>")

doc('#1').html()    #返回test 1
doc('.2').html()    #返回test 2
4.8 attr()——属性获取和修改
doc=pq("<p id='my_id'><a href='http://hello.com'>hello</a></p>")

# 获取属性
doc('a').attr('href')    #返回http://hello.com
doc('p').attr('id')      #返回my_id
# 修改属性
doc('p').attr('id','id_test')             #返回<p id='id_test'><a href='http://hello.com'>hello</a></p>
doc('a').attr('href','https://baidu.com') #返回<p id='id_test'><a href='https://baidu.com'>hello</a></p> 
4.9 css()——style属性的获取和修改
doc=pq("<p id='my_id'>hello</p>")

doc('p').css('font-size', '20px')   # 返回<p id='my_id' style=’font-size: 20px‘>hello</p>
4.10 addClass(value) / removeClass(value)——为元素添加类/删除类
doc=pq('<div></div>')

doc.addClass('my_class')     #返回 <div class='my_class'></div>
doc.removeClass('my_class')  #返回 <div></div>
4.11 hasClass(name) #返回判断元素是否包含给定的类
doc=pq("<div class='my_class'></div>")

doc.hasClass('my_class')    #返回True
4.12 children(selector=None) ——获取子元素
doc=pq("<span><p id='1'>hello</p><p id='2'>world</p></span>")

doc.children()        #返回[<p#1>, <p#2>]
doc.children('#2')    #返回[<p#2>]
4.13 parents(selector=None)——获取父元素
doc=pq("<span><p id='1'>hello</p><p id='2'>world</p></span>")

doc('p').parents()           #返回[<span>]
doc('#1').parents('span')    #返回[<span>]
doc('#1').parents('p')       #返回[]
4.14 siblings(selector=None) ——获取兄弟节点
html = "
<ul id="container">
 <li class="object-1"/>
 <li class="object-2"/>
 <li class="object-3"/>
</ul>
"
doc = pq(html)
ob2 = doc.find(.object-2)
print(ob2.siblings())  # 返回 <li class="object-1"/>  <li class="object-3"/> 
4.15 clone() ——返回一个节点的拷贝
doc=pq("<span><p id='one'>hello</p><p id='two'>world</p></span>")

print(doc('#one'))              # <p id="one">hello</p>
print(doc('#one').clone())      # <p id="one">hello</p>
4.16 empty() ——移除节点内容
doc=pq("<span><p id='one'>hello</p><p id='two'>world</p></span>")

print(doc)           # <span><p id="one">hello</p><p id="two">world</p></span>

doc('#one').empty()
print(doc)           # <span><p id="one"/><p id="two">world</p></span>
4.17 nextAll(selector=None) ——返回后面全部的元素块
doc=pq("<p id='1'>hello</p><p id='2'>world</p><img scr='' />")

doc('p:first').nextAll()    #返回[<p#2>, <img>]
doc('p:last').nextAll()     #返回[<img>]
4.18 not_(selector) ——返回不匹配选择器的元素
doc=pq("<p id='1'>test 1</p><p id='2'>test 2</p>")

doc('p').not_('#2')  #返回[<p#1>]
4.19 remove()——移除标签
html = '''<div class='content'>
    <ul id = 'haha'>
         <li class="item-0">first item</li>
         <li class="item-1"><a href="link2.html">second item</a></li>
     </ul></div>'''
     
doc = pq(html)
data = doc('.content')
print(data.text())       #输出 first item second item
#删除所有a标签
data.find('a').remove()
#再次打印
print(data.text())       # 输出 first item
4.20 遍历查找
from pyquery import PyQuery as pq
html = '''
    <div href="wrap">
        hello nihao
        <ul class="s_from">
            asdasd
            <link class='active1 a123' href="http://asda.com">asdadasdad12312</link>
            <link class='active2' href="http://asda1.com">asdadasdad12312</link>
            <link class='movie1' href="http://asda2.com">asdadasdad12312</link>
        </ul>
    </div>
'''

doc = pq(html)
its=doc("link").items()
for it in its:
    print(it)
========================
输出结果:
<link class="active1 a123" href="http://asda.com">asdadasdad12312</link>
            
<link class="active2" href="http://asda1.com">asdadasdad12312</link>
            
<link class="movie1" href="http://asda2.com">asdadasdad12312</link>

5.自定义方法
5.1 访问网址

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

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

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

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

from pyquery import PyQuery as pq
from selenium.webdriver import PhantomJS

#用selenium访问url
def selenium_opener(url):
	 driver = PhantomJS(executable_path = 'phantomjs的路径')
	 driver.get(url)
	 html = driver.page_source
	 driver.quit()
	 return html
	 
#注意,使用时opener参数是函数名,没有括号的!
pq(url='https://www.baidu.com/', opener=selenium_opener)

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

5.3 cookies、headers

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

from pyquery import PyQuery as pq
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'}

pq(url='https://www.baidu.com/',headers=headers,cookies=cookies)

让你的selenium带上pyquery功能

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

from pyquery import PyQuery as pq
from selenium.webdriver import PhantomJS

class Browser(PhantomJS):
	 @property
	 def dom(self):
	  	 return pq(self.page_source)

browser = Browser(executable_path='phantomjs的路径')
browser.get(url='https://www.baidu.com/')

print(type(browser.dom))   # 返回<class 'pyquery.pyquery.PyQuery'>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值