大家好,今天为大家带来的是爬虫解析库中的pyquery。
下面给出一个十分简单的示例,让大家对pyquery有一个直观的印象:
#导包
from pyquery import PyQuery as pq
# 初始化
text = '''
'''
doc = pq(text)
print(doc('li'))
结果如下:
你好
白菜,你好,我是黑菜
白菜,你好,你好
我是一个小白菜
大白菜
黑彩
方法一:字符串
将html代码字符串化,然后传给PyQuery类,如下:
#导包
from pyquery import PyQuery as pq
# 初始化
text = '''
'''
doc = pq(text)
print(type(doc))
结果如下:
方法二:url
直接将url传给PyQuery类,如下:
#导包
from pyquery import PyQuery as pq
# 初始化
doc = pq(url='https://www.baidu.com')
print(doc)
结果如下:
# 部分结果
方法三:文件
直接指定文件名,当然文件内容是html代码,如下:
#导包
from pyquery import PyQuery as pq
# 初始化
doc = pq(filename='../06 re/bizhi.html') # 这里大家要自己修改一下文件路径
print(doc)
结果如下:
4K鍔ㄦ极澹佺焊_楂樻竻4K鍔ㄦ极鍥剧墖_褰煎哺鍥剧綉
1.css选择器:
语法:xxx('css语法')
作用:返回符合条件的所有的节点
这个主要考察css语法,如果不会的朋友我之后会专门写篇文章来讲解css语法和html语法。这里就不赘述
示例:
#导包
from pyquery import PyQuery as pq
# 初始化
text = '''
'''
# 初始化
doc = pq(text)
# 1: 选择第一个a标签
print(doc('.hello'))
# 2: 选择所有class等于white的标签
print(doc('.white'))
结果如下:
你好
白菜,你好,我是黑菜
白菜,你好,你好
我是一个小白菜
大白菜
2.方法选择:
除去css语法外,还可以使用一些内置的方法,如:children、find等等。
方法一:find方法
语法:xxx.find('css语法')
作用:查找出所有符合条件的子节点
示例:
#导包
from pyquery import PyQuery as pq
# 初始化
text = '''
'''
# 初始化
doc = pq(text)
# 1: 选择所有class等于white的标签
print(doc.find('.white'))
结果如下:
白菜,你好,我是黑菜
白菜,你好,你好
我是一个小白菜
大白菜
方法二:children方法
语法:xxx.children('css语法')
作用:查找所有符合条件的直接子节点
示例:
#导包
from pyquery import PyQuery as pq
# 初始化
text = '''
'''
# 初始化
doc = pq(text)
# 1: 选择所有class等于white的标签
print(doc.find('li .test').children('a'))
结果如下:
直接子节点
直接子节点
方法三:parent和parents方法
语法:xx.parent('css语法') or xxx.parents('css语法')
作用:parent是获取所有符合条件的父节点,而parents是获取所有符合条件的祖先节点。
示例:
#导包
from pyquery import PyQuery as pq
# 初始化
text = '''
'''
# 初始化
doc = pq(text)
# 1: 选择所有class等于white的标签
a_tag = doc.find('li .test div').children('a')
print(a_tag.parent('.test')) # 无结果,因为不是直接父节点
print(a_tag.parents('.test'))
结果如下:
方法四:siblings
语法:xxx.siblings('css语法')
作用:获取所有符合条件的兄弟节点
示例:
#导包
from pyquery import PyQuery as pq
# 初始化
text = '''
'''
# 初始化
doc = pq(text)
# 1: 选择一个a节点
a_tag = doc('.black')
print(a_tag.siblings('.white'))
结果如下:
大白菜
我是一个小白菜
白菜,你好,你好
白菜,你好,我是黑菜
因为这里选取的所有节点返回的结果不是列表类型,而是pyquery类型,如下:
#导包
from pyquery import PyQuery as pq
# 初始化
text = '''
'''
# 初始化
doc = pq(text)
# 1: 选择一个a节点
a_tag = doc('.black')
print(type(a_tag.siblings('.white')))
结果如下:
因此,需要使用特殊的方法进行遍历,即xxx.items(),这个方法的作用是得到一个生成器,可以循环调用,如下:
#导包
from pyquery import PyQuery as pq
# 初始化
text = '''
'''
# 初始化
doc = pq(text)
a_tags = doc('.white')
print(type(a_tags.items()))
print('-'*50)
for a in a_tags.items():
print(a)
结果如下:
--------------------------------------------------
白菜,你好,我是黑菜
白菜,你好,你好
我是一个小白菜
大白菜
提取到元素后就要获取信息,方法如下:
获取属性:
方法:xxx.attr('属性名字')
示例:
#导包
from pyquery import PyQuery as pq
# 初始化
text = '''
'''
# 初始化
doc = pq(text)
# 1: 选择一个a节点
a_tag = doc('.black')
siblings_tag = a_tag.siblings('.white').items()
for tag in siblings_tag:
print(tag.attr('class'))
结果如下:
white
white
white
white
获取文本:
方法一:xxx.text()
作用:获取内部所有的文本信息,不包含节点信息,整体是一个字符串,如果选中的是多个节点,则不同节点之间内容以空格隔开
如下:
一个节点
#导包
from pyquery import PyQuery as pq
# 初始化
text = '''
'''
# 初始化
doc = pq(text)
# 1: 获取div(class=test)标签
div_tag = doc('.test')
print(div_tag.text())
结果如下:
# 不包含节点信息,只是一个字符串,而不是三个
直接子节点
不是直接子节点
直接子节点
多个节点:
#导包
from pyquery import PyQuery as pq
# 初始化
text = '''
'''
# 初始化
doc = pq(text)
# 1: 获取div(class=test)标签
a_tags = doc('.white')
print(a_tags.text())
结果如下:
白菜,你好,我是黑菜 白菜,你好,你好 我是一个小白菜 大白菜
# 一个字符串,不用标签之间以空格隔开
方法二:xxx.html()
作用:返回字符串,包含节点信息,如果选中多个节点,返回第一个节点的文本。
如下:
#导包
from pyquery import PyQuery as pq
# 初始化
text = '''
'''
# 初始化
doc = pq(text)
# 1: 单个节点
div_tag = doc('.test')
print(div_tag.html())
print('-'*50)
#2 : 多个节点
a_tags = doc('.white')
print(a_tags.html())
结果如下:
直接子节点
直接子节点
--------------------------------------------------
白菜,你好,我是黑菜
节点操作,主要用于信息提取中,有时候可以有效去掉杂质信息。
方法一:改变class属性值
添加class属性:xxx.addClass('class值')
删除class属性:xxx.removeClass('class属性值')
方法二:改变属性值
方法:xxx.attr('属性名字','属性值')
方法三:改变标签内容
方法:xx.text('只改变文本')
方法:xxx.html('可以写html代码或者文本')
方法四:删除节点
方法:xxx.remove()
以上四种方法只要用于提取信息,因为有时候我们提取的信息有一些杂质,我们可以把这些杂质删除或者修改class值等等来达到提纯的目的。
pyquery库就到此为止,这个库建议学习过css的同学来用,谢谢大家。