解析库的使用
ch4. 解析库的使用
- 使用
Xpath
- 使用
pyquery
使用pyquery
1. 基本方法
from pyquery import PyQuery as pq
doc = pq(html)
print(doc)
PyQuery对象可以接受的参数有
- html格式的字符串
- html文件
- 指定参数
url = '...'
PyQuery对象用于后续的进行选择、筛选等操作
2. CSS选择器
用于解析的html格式的字符串
html
html = '''
<div class = "wrap">
<div id = "container">
<ul class = "list">
<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"><forth item</a></li>
<li class = "item-0"><a href = "link5.html">fifth item</a></li>
</ul>
</div>
</div>
'''
from pyquery import PyQuery as pq
doc = pq(html)
doc('#container .list li')
print(doc)
-
用pq对象初始化后,通过在单引号中输入筛选条件来完成在pq文件中的筛选
-
这种筛选用法为css选择器,选择条件间以空格分开
-
#name
表示id为name,.name
表示class为name,name
表示选择name节点 -
此时doc对象仍为pq类型
-
选择器的并列于先后关系
以
doc('.list .item-0.active')
为例- 先选择了
class = "list"
的节点,之后再进行一次筛选,选择了class = "item-0 active"
的节点 - 也即是说空格前后在筛选时有着先后的顺序关系,未以空格分割开的同类条件有着并列关系。
- 先选择了
3. 查找结点的函数
pq.find()
:在所有子孙节点中查找pq.children()
:在所有子节点中查找pq.parent()
:在该结点的父结点中查找pq.parents()
:在该结点的祖先节点中查找
其中括号中传入的参数仍为CSS选择器的语法,即仍为:doc('#container .list li')
4. 结合选择器进行遍历
在查询结果不止一条时,需要通过遍历来完成更高的操作要求。
doc = pq(html)
lis = doc('li').items()
for aNode in lis:
print(aNode)
- 对查询结果调用了
items()
方法,这时类型会由PyQuery转变为迭代对象generator,可以使用for语句来进行操作
5. 对查询结果进行进一步的操作
可以进行的操作包括
- 获取节点的属性、文本
- 删除、改变或添加节点的属性、文本
- 移除某个节点
1. 获取属性
-
pq.attr('attrName')
doc = pq(html) a = doc('.item-0.active a') print(a.attr('href')) print(a.attr.href) #另一种写法
该代码段选中的节点如下:
<a href="link3.html"><span class="bold">third item</span></a>
最后输出结果为:
link3.html
,输出了对应的a节点中的超链接的内容。- 特别注意:在PyQuery查询对象结果中有多个时,该方法只会输出第一个节点中的内容。若要实现多个节点的内容均输出,需要结合上一届的迭代来完成。
2. 获取文本
-
pq.text()
doc = pq(html) a = doc('.item-0.active a') print(a.text())
该代码段选中的节点如下:
<a href="link3.html"><span class="bold">third item</span></a>
最后输出的结果为:
third item
,输出了节点的纯文字内容。 -
pq.html()
若选择该方法,则返回的为该节点的全部html语句,即输出结果为:
<a href="link3.html"><span class="bold">third item</span></a>
,但此时的类型为字符串。 -
特别注意
若得到的查询结果为多个节点
- .text()方法不需要遍历就可以取得
- .html()方法需要遍历才可以取得
3. 移除/添加class
-
pq.removeClass('className')
:移除类名 -
pq.addClass('className')
:添加类名使用这些方法时,需要先选定要修改的节点
4. 对节点内容修改、添加与删除
pq.attr('name','content)
: 若name为已经存在的属性名称,则进行修改操作;若name尚不存在,则表示添加新属性pq.text('content')
: 将该节点的纯文本内容改作content
pq.html('content')
:将该节点的html内容改为content
pq.remove()
: 需要先选中某个节点,执行后会将该节点删除。