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'>