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三者对比