pyquery库观赏有感

原文pyquery库

pyquery主要是用在CSS选择器上

使用方法

pyquery包中有一个PyQuery类,导入该类,然后创建该类的实例
有三种方式将HTML文档传入PyQuery实例中;
这里主要多出的就是url
其他两种就是:字符串和文件

from pyquery import PyQuery as pq
doc = pq(html)

获取属性和文本

for a in doc('a'):
    print(a.get('href'),a.text)

CSS选择器

由于PyQuery实例重载了函数调用运算符(实现了__call__函数)
所以可以向调用函数一样使用的实例。函数参数就是CSS代码

# 提取id属性值为panel,并在该节点中所有属性值为list1的所有节点
result = doc('#panel .list1')
# 在result为根的基础上,提取其中class属性值为item的所有节点
print(result('.item'))
# 提取其中的第2个a节点的href属性值和文本内容
print(result('a')[1].get('href'),result('a')[1].text)

查找结点

find方法和children方法查找子节点
find查找子节点,连同非直接子节点<a>ok<a>都找出来了,而children方法并没有找到该子节点

result = doc('.list1')
# 查找所有的a节点,包括子孙节点
aList = result.find('a')
# 查找所有class属性值为item的所有节点
result = doc('.item')
aList = result.children('a')

输出每一个子节点这里需要编码
还需要pretty_print=True

for a in aList:
    # 输出每一个查找到的a节点
    print(str(etree.tostring(a,pretty_print=True,encoding='utf-8'),'utf-8'))

查找父节点

parent()查找直接父节点
parents()查找所有父节点
这两种方法都可以传入CSS选择器

查找兄弟节点

siblings方法可以查询当前节点的所有兄弟节点
查询特定的兄弟节点可以传入CSS选择器参数

获取节点信息

PyQuery实例传入的html对象得到的对象,再用CSS选择器参数传入该对象中,因为有回调函数所以可以传入对象中,
.tag获得标签名
.attr()获得属性
.text()获得文本

修改节点

添加和移除节点的样式采用addClass()和removeClass().函数中的参数不呢个带点(.),否则江会把点(.)作为样式名的一部分添加到class属性中
删除多个样式时候,多个样式之间用空格分隔
提取多个样式要首位相连,中间不能有空格

doc = pq(html)
li = doc('.item1.item2')

修改系欸但属性和文本内容

attr方法向节点添加新的属性,如果添加的属性已存在,则会修改原来的属性值。
removeAttr方法,该方法需要传入一个字符串类型的值,用于设置节点内容

li.attr('class','myitem1,myitem2')
print(li)
li.removeAttr('id')

修改节点文本可以使用text和html。其中html方法用于设置节点中的HTML代码,text方法用来设置文本形式的节点内容。
其中text方法和html方法的最大区别就是转码和解析。

li.text('\n<a href="https://www.google.com"/>\n')
print(li)
li.html('\n<a href="https://www.google.com"/>\n')

删除节点

remove方法可以删除节点,接收一个字符串类型的参数,用于指定要删除的节点名,不指定就删除当前节点

li.remove('p')
print(li.find('p').remove())

伪类下选择器

这里说的不是CSS中的悬浮,移出等属性。
而是操作在索引层面上的
可以选择第一个节点,索引为奇数的节点,包含某一个文本的节点

# 选取第一个节点
li = doc('li:first-child')
# 选取第三个节点
li = doc('li:nth-child(3)')
# 选取序号为奇数的li节点
li = doc('li:nth-child(2n+1)')
# 选取文本内容包含com的所有li节点
li = doc('li:contains(com)')
posted @ 2021-10-04 20:51  索匣  阅读(28)  评论(0编辑  收藏  举报