pip install lxml #pyquery依赖于lxml解析库 pip install pyquery
在解析 HTML 文本的时候,首先需要将其初始化为一个 pyquery 对象。PyQuery的初始化方式有多种:传入字符串、 URL、文件名,等等。
html = ''' <div> <ul> <li class="item-0">first item</li> <li class="item-1"><a href="link2.html">second item</a></li> <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li> <li class="item-1 active"><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'))
from pyquery import PyQuery as pq doc = pq(url='http://www.baidu.com',encoding="utf-8") print(doc('title'))
1.3、注意:初始化URL时推荐先使用爬虫库(urllib、resquests)封装URL后再传递给pyquery(爬取数据和解析数据分开):
from pyquery import PyQuery as pq import requests res = requests.get('http://www.baidu.com') res.encoding="utf-8" doc = pq(res.text) print(doc('title'))
demo.html文件示例:
<div id="container"> <ul class="list"> <li class="item-0">first item</li> <li class="item-1"><a rel="nofollow" href="link2.html">second item</a></li> <li id="item-0"><a rel="nofollow" href="link2.html">second item</a></li> <li class="item-0 active"><a rel="nofollow" href="link3.html"><span class="bold">third item</span></a></li> <li class="item-1 active"><a rel="nofollow" href="link4.html">fourth item</a></li> <li class="shop"><a rel="nofollow" href="link5.html">fifth item</a></li> <a rel="nofollow" href="link5.html">te xxx</a> <p>tet1</p> <p>tet2</p> <p>tet3</p> </ul> <div>test0001</div> </div>
from pyquery import PyQuery as pq doc = pq(filename='demo.html') print(doc('li'))
语法:doc("节点名")
——通过CSS选择器来获取目标内容(满足CSS语法)。
# 选取class为list的节点 items = doc('.list') #关联选择符的使用 print(doc("ul li.shop a"))
doc("")
,嵌套元素用空格隔开)doc("节点名").find("节点名")
#查找 <ul> 内部的 a 元素 print(doc('ul').find('a')) print(doc("ul a")) #查找 <ul> 内的直接子 a 子标签 print(doc('ul').children('a')) print(doc("ul > a"))
doc("节点名").filter()
#查找 class 为 item-1 的 li 元素() print(doc('li').filter('.item-1')) print(doc("li.item-1")) #查找 id 为 item-0 的 li元素 print(doc('li').filter('#item-0')) print(doc("li#item-0")
pyquery的选择结果可能是单个节点(可以直接打印输出,也可以直接转成字符串);
也可能是多个节点,类型都是PyQuery类型,多个结果时所以需要遍历来获取。
这时候需要调用 items() 方法;调用 items 方法后,会得到一个生成器,遍历一下,就可以逐个得到 单节点对象了。
语法:doc("节点名").items()
lis = doc('li').items() for li in lis: print(li)
提取到节点之后,我们的最终目的当然是提取节点所包含的信息了。比较重要的信息有两类,一是获取属性,二是获取文本。
4.1、获取、修改文本信息
语法:
doc("节点名").html()——用html()获取HTML文本;
doc("节点名").text()——用text()来获取文本(只返回纯文字内容)。
print(doc('a').text()) #返回所有a标签文本内容 print(doc('a').text("阿里")) #会将所有a标签内容修改为“阿里”
#获取祖先节点 # 子节点 items = doc('.list') lis = items.children() print(lis) # class为active的子节点 lis = items.children('.active') print(lis) # 父节点 lis = items.parent() print(lis) # 祖先节点,如果需要筛选,也可以传入CSS选择器 container = items.parents() print(container) # 兄弟节点 lis1 =items.siblings() print(lis1)
pyquery 提供了一系列方法来对节点进行动态修改,比如为某个节点添加一个 class,移除某个节点等,这些操作有时会为提取信息带来极大的便利。
li = doc('item-0.active') #获取元素属性的值 li.attr('href') # 删除class属性 li.removeClass('active') # 添加class属性 li.addClass('active') # 改变属性 li.attr('name', 'link') # 改变文本内容 li.text(str) # 改变html li.html(html) # 移除指定节点 li.remove() li.find("a").remove() #移除子节点a标签
# 第一个li节点 li = doc('li:first-hild') # 最后一个li节点 li = doc('li:last-child') # 第二个li节点 li = doc('li:nth-child(2)') # 第三个li之后的li节点 li = doc('li:gt(2)') # 偶数位置的li节点 li = doc('li:nth-child(2n)') # 包含second文本的li节点 li = doc('li:contains(second)')