解析库的使用

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节点中的超链接内容

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(): 需要先选中某个节点,执行后会将该节点删除

相关文章

vue阻止冒泡事件 阻止点击事件的执行 &lt;div @click=&a...
尝试过使用网友说的API接口获取 找到的都是失效了 暂时就使用...
后台我拿的数据是这样的格式: [ {id:1 , parentId: 0, name:...
JAVA下载文件防重复点击,防止多次下载请求,Cookie方式快速简...
Mip是什么意思以及作用有哪些