1.pyquery介绍
pyquery优势,CSS选择器功能非常强大。
2.初始化解析
2.1字符串初始化
html = '''
<div id="container">
<ul class="list>
<li class="li li-first" name="item"><a href="link1.html"><span>first item</span></a></li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-1 active"><a href="link3.html">third item</a></li>
<li class="item-1"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a></li>
</ul>
</div>
'''
from pyquery import PyQuery as pq
doc = pq(html)
print(doc('li'))
2.2 URL初始化
from pyquery import PyQuery as pq
doc = pq(url='http://www.baidu.com/')
print(doc('title'))
#用法同下:
import requests
res = requests.get('http://www.baidu.com/')
doc = pq(res.text)
print(doc('title'))
2.3 本地文件初始化
from pyquery import PyQuery as pq
doc = pq(filename='./test.html')
print(doc('li'))
3.基本CSS选择器使用
from pyquery import PyQuery as pq
doc = pq(filename='./test.html')
print(doc('#container .list li'))
4.节点查找
4.1 子节点
items = doc('.list')
print(items.find('li')) #find()查找所有子孙节点
print(items.children('li')) #children()查找子节点
print(items.children('.li-first'))
4.2 父节点
items = doc('.list')
print(items.parent()) #parent()查找直接父节点
print(items.parents()) #parents()查找所有祖先节点
print(items.parents('#container'))
4.3 兄弟节点
items = doc('.list .item-inactive')
print(items.siblings()) #返回所有兄弟节点
print(items.siblings('.item-0'))
5.遍历
lis = doc('li').items() #调用items()得到一个生成器,每一个li为新的PyQuery类型,可以继续查找
print(type(lis)) #<class 'pyquery.pyquery.PyQuery'>
for li in lis:
print(li)
print(type(li)) #<class 'pyquery.pyquery.PyQuery'>
6.获取信息
6.1 获取属性
a = doc('a')
print(a.attr('href')) #调用attr()方法时,只返回第一个符合条件的
for item in a.items():
print(item.attr('href')) #遍历后可以返回所有
6.2 获取文本
a = doc('a')
print(a.text()) #获取所有a节点内的纯文本信息,中间用空格隔开,返回一个字符串格式
print(type(a.text())) #<class 'str'>
print(a.html()) #只返回第一个a节点里的HTML文本
for item in a.items():
print(item.html()) #需遍历得到所有HTML文本
7.节点操作
pyquery提供了一系列的方法对节点进行动态操作,如添加移除class,添加节点等。
7.1 removeClass()和addClass(),对class属性进行移除和添加
li = doc('.item-1.active') #同一个节点的多个属性见不用空格键,否则表示向下查找
print(li) #<li class="item-1 active"><a href="link3.html">third item</a></li>
li.removeClass('active')
print(li) #<li class="item-1"><a href="link3.html">third item</a></li>
li.addClass('active')
print(li) #<li class="item-1 active"><a href="link3.html">third item</a></li>
7.2 attr、text和html
li = doc('.item-1.active')
print(li) #<li class="item-1 active"><a href="link3.html">third item</a></li>
li.attr('name','link') #修改属性,第一个参数名为属性名称,第二个为属性值,如果不传第二个参数则为获取该属性值
print(li) #<li class="item-1 active" name="link"><a href="link3.html">third item</a></li>
li.text('changed item') #修改文本内容,不传参则为获取该文本内容
print(li) #<li class="item-1 active" name="link">changed item</li>
li.html('<span>changed item</span>')
print(li) #<li class="item-1 active" name="link"><span>changed item</span></li>
7.3 remove()
html ='''
<div id="container">
first
<p>second</p>
</div>
'''
from pyquery import PyQuery as pq
doc = pq(html)
div = doc('#container')
print(div.text())
div.find('p').remove()
print(div.text()) #只获取div的直接文本内容
其他操作方法还有append(),empty(),prepend()等,用法和jQuery用法一致。
8.伪类选择器
print(doc('li:first-child'))
print(doc('li:last-child'))
print(doc('li:nth-child(2)'))
print(doc('li:gt(3)'))
print(doc('li:nth-child(2n)'))
print(doc('li:contains(first)'))
9.BeautifulSoup,xpath和pyquery三者对比