python爬虫教程(七):pyquery库

大家好,今天为大家带来的是爬虫解析库中的pyquery。

一、示例

下面给出一个十分简单的示例,让大家对pyquery有一个直观的印象:

#导包
from pyquery import PyQuery as pq
# 初始化
text = '''
<ul class="clearfix">
    <li>
        <a class="hello" href="/tupian/26783.html" target="_blank">你好</a>
        <a class="white" href="/tupian/26783.html" target="_blank">白菜,你好,我是黑菜</a>
        <a class="white" href="/tupian/26783.html" target="_blank">白菜,你好,你好</a>
        <a class="white" href="/tupian/26783.html" target="_blank">我是一个小白菜</a>
        <a class="white" href="/tupian/26783.html" target="_blank">大白菜</a>
        <a class="black" href="/tupian/26783.html" target="_blank">黑彩</a>
    </li>
</ul>
'''
doc = pq(text)
print(doc('li'))

结果如下:

<li>
        <a class="hello" href="/tupian/26783.html" target="_blank">你好</a>
        <a class="white" href="/tupian/26783.html" target="_blank">白菜,你好,我是黑菜</a>
        <a class="white" href="/tupian/26783.html" target="_blank">白菜,你好,你好</a>
        <a class="white" href="/tupian/26783.html" target="_blank">我是一个小白菜</a>
        <a class="white" href="/tupian/26783.html" target="_blank">大白菜</a>
        <a class="black" href="/tupian/26783.html" target="_blank">黑彩</a>
</li>

二、初始化

方法一:字符串

将html代码字符串化,然后传给PyQuery类,如下:

#导包
from pyquery import PyQuery as pq
# 初始化
text = '''
<ul class="clearfix">
    <li>
        <a class="hello" href="/tupian/26783.html" target="_blank">你好</a>
        <a class="white" href="/tupian/26783.html" target="_blank">白菜,你好,我是黑菜</a>
        <a class="white" href="/tupian/26783.html" target="_blank">白菜,你好,你好</a>
        <a class="white" href="/tupian/26783.html" target="_blank">我是一个小白菜</a>
        <a class="white" href="/tupian/26783.html" target="_blank">大白菜</a>
        <a class="black" href="/tupian/26783.html" target="_blank">黑彩</a>
    </li>
</ul>
'''
doc = pq(text)
print(type(doc))

结果如下:

<class 'pyquery.pyquery.PyQuery'>

方法二:url

直接将url传给PyQuery类,如下:

#导包
from pyquery import PyQuery as pq
# 初始化
doc = pq(url='https://www.baidu.com')
print(doc)

结果如下:

<html> <head><meta http-equiv="content-type" content="text/html;charset=utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=Edge"/><meta content="always" name="referrer"/><link rel="stylesheet" type="text/css" href="https://ss1.bdstatic.com/5eN1bjq8AAUYm2zgoY3K/r/www/cache/bdorz/baidu.min.css"/>
# 部分结果

方法三:文件

直接指定文件名,当然文件内容是html代码,如下:

#导包
from pyquery import PyQuery as pq
# 初始化
doc = pq(filename='../06 re/bizhi.html') # 这里大家要自己修改一下文件路径
print(doc)

结果如下:

<html>
<head>
<meta charset="gbk"/>
<title>4K鍔ㄦ极澹佺焊_楂樻竻4K鍔ㄦ极鍥剧墖_褰煎哺鍥剧綉</title>
<meta name="keywords" content="4K鍔ㄦ极澹佺焊,楂樻竻4K鍔ㄦ极澹佺焊,4K鍔ㄦ极鍥剧墖,4K鍔ㄦ极鐢佃剳澹佺焊,4K鍔ㄦ极妗岄潰澹佺焊"/>
<meta name="description" content="褰煎哺鍥剧綉鍏嶈垂鎻愪緵娓呮柊鍞"/></head></html>

三、选择元素

1.css选择器:

语法:xxx('css语法')

作用:返回符合条件的所有的节点

这个主要考察css语法,如果不会的朋友我之后会专门写篇文章来讲解css语法和html语法。这里就不赘述

示例:

#导包
from pyquery import PyQuery as pq
# 初始化
text = '''
<ul class="clearfix">
    <li>
        <a class="hello" href="/tupian/26783.html" target="_blank">你好</a>
        <a class="white" href="/tupian/26783.html" target="_blank">白菜,你好,我是黑菜</a>
        <a class="white" href="/tupian/26783.html" target="_blank">白菜,你好,你好</a>
        <a class="white" href="/tupian/26783.html" target="_blank">我是一个小白菜</a>
        <a class="white" href="/tupian/26783.html" target="_blank">大白菜</a>
        <a class="black" href="/tupian/26783.html" target="_blank">黑彩</a>
    </li>
</ul>
'''
# 初始化
doc = pq(text)
# 1: 选择第一个a标签
print(doc('.hello'))
# 2: 选择所有class等于white的标签
print(doc('.white'))

结果如下:

<a class="hello" href="/tupian/26783.html" target="_blank">你好</a>
        
<a class="white" href="/tupian/26783.html" target="_blank">白菜,你好,我是黑菜</a>
<a class="white" href="/tupian/26783.html" target="_blank">白菜,你好,你好</a>
<a class="white" href="/tupian/26783.html" target="_blank">我是一个小白菜</a>
<a class="white" href="/tupian/26783.html" target="_blank">大白菜</a>

2.方法选择:

除去css语法外,还可以使用一些内置的方法,如:children、find等等。

方法一:find方法

语法:xxx.find('css语法')

作用:查找出所有符合条件的子节点

示例:

#导包
from pyquery import PyQuery as pq
# 初始化
text = '''
<ul class="clearfix">
    <li>
        <a class="hello" href="/tupian/26783.html" target="_blank">你好</a>
        <a class="white" href="/tupian/26783.html" target="_blank">白菜,你好,我是黑菜</a>
        <a class="white" href="/tupian/26783.html" target="_blank">白菜,你好,你好</a>
        <a class="white" href="/tupian/26783.html" target="_blank">我是一个小白菜</a>
        <a class="white" href="/tupian/26783.html" target="_blank">大白菜</a>
        <a class="black" href="/tupian/26783.html" target="_blank">黑彩</a>
    </li>
</ul>
'''
# 初始化
doc = pq(text)
# 1: 选择所有class等于white的标签
print(doc.find('.white'))

结果如下:

<a class="white" href="/tupian/26783.html" target="_blank">白菜,你好,我是黑菜</a>
<a class="white" href="/tupian/26783.html" target="_blank">白菜,你好,你好</a>
<a class="white" href="/tupian/26783.html" target="_blank">我是一个小白菜</a>
<a class="white" href="/tupian/26783.html" target="_blank">大白菜</a>

方法二:children方法

语法:xxx.children('css语法')

作用:查找所有符合条件的直接子节点

示例:

#导包
from pyquery import PyQuery as pq
# 初始化
text = '''
<ul class="clearfix">
    <li>
        <div class="test">
            <a class="son" href="/tupian/26783.html" target="_blank">直接子节点</a>
            <div>
                <a class="hello" href="/tupian/26783.html" target="_blank">不是直接子节点</a>
            </div>
            <a class="son" href="/tupian/26783.html" target="_blank">直接子节点</a>
        </div>
        <a class="white" href="/tupian/26783.html" target="_blank">白菜,你好,我是黑菜</a>
        <a class="white" href="/tupian/26783.html" target="_blank">白菜,你好,你好</a>
        <a class="white" href="/tupian/26783.html" target="_blank">我是一个小白菜</a>
        <a class="white" href="/tupian/26783.html" target="_blank">大白菜</a>
        <a class="black" href="/tupian/26783.html" target="_blank">黑彩</a>
    </li>
</ul>
'''
# 初始化
doc = pq(text)
# 1: 选择所有class等于white的标签
print(doc.find('li .test').children('a'))

结果如下:

<a class="son" href="/tupian/26783.html" target="_blank">直接子节点</a>
<a class="son" href="/tupian/26783.html" target="_blank">直接子节点</a>

方法三:parent和parents方法

语法:xx.parent('css语法')  or    xxx.parents('css语法')

作用:parent是获取所有符合条件的父节点,而parents是获取所有符合条件的祖先节点。

示例:

#导包
from pyquery import PyQuery as pq
# 初始化
text = '''
<ul class="clearfix">
    <li>
        <div class="test">
            <a class="son" href="/tupian/26783.html" target="_blank">直接子节点</a>
            <div>
                <a class="hello" href="/tupian/26783.html" target="_blank">不是直接子节点</a>
            </div>
            <a class="son" href="/tupian/26783.html" target="_blank">直接子节点</a>
        </div>
        <a class="white" href="/tupian/26783.html" target="_blank">白菜,你好,我是黑菜</a>
        <a class="white" href="/tupian/26783.html" target="_blank">白菜,你好,你好</a>
        <a class="white" href="/tupian/26783.html" target="_blank">我是一个小白菜</a>
        <a class="white" href="/tupian/26783.html" target="_blank">大白菜</a>
        <a class="black" href="/tupian/26783.html" target="_blank">黑彩</a>
    </li>
</ul>
'''
# 初始化
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'))

结果如下:

<div class="test">
            <a class="son" href="/tupian/26783.html" target="_blank">直接子节点</a>
            <div>
                <a class="hello" href="/tupian/26783.html" target="_blank">不是直接子节点</a>
            </div>
            <a class="son" href="/tupian/26783.html" target="_blank">直接子节点</a>
</div>

方法四:siblings

语法:xxx.siblings('css语法')

作用:获取所有符合条件的兄弟节点

示例:

#导包
from pyquery import PyQuery as pq
# 初始化
text = '''
<ul class="clearfix">
    <li>
        <div class="test">
            <a class="son" href="/tupian/26783.html" target="_blank">直接子节点</a>
            <div>
                <a class="hello" href="/tupian/26783.html" target="_blank">不是直接子节点</a>
            </div>
            <a class="son" href="/tupian/26783.html" target="_blank">直接子节点</a>
        </div>
        <a class="white" href="/tupian/26783.html" target="_blank">白菜,你好,我是黑菜</a>
        <a class="white" href="/tupian/26783.html" target="_blank">白菜,你好,你好</a>
        <a class="white" href="/tupian/26783.html" target="_blank">我是一个小白菜</a>
        <a class="white" href="/tupian/26783.html" target="_blank">大白菜</a>
        <a class="black" href="/tupian/26783.html" target="_blank">黑彩</a>
    </li>
</ul>
'''
# 初始化
doc = pq(text)
# 1: 选择一个a节点
a_tag = doc('.black')
print(a_tag.siblings('.white'))

结果如下:

<a class="white" href="/tupian/26783.html" target="_blank">大白菜</a>
<a class="white" href="/tupian/26783.html" target="_blank">我是一个小白菜</a>
<a class="white" href="/tupian/26783.html" target="_blank">白菜,你好,你好</a>
<a class="white" href="/tupian/26783.html" target="_blank">白菜,你好,我是黑菜</a>

四、遍历

因为这里选取的所有节点返回的结果不是列表类型,而是pyquery类型,如下:

#导包
from pyquery import PyQuery as pq
# 初始化
text = '''
<ul class="clearfix">
    <li>
        <div class="test">
            <a class="son" href="/tupian/26783.html" target="_blank">直接子节点</a>
            <div>
                <a class="hello" href="/tupian/26783.html" target="_blank">不是直接子节点</a>
            </div>
            <a class="son" href="/tupian/26783.html" target="_blank">直接子节点</a>
        </div>
        <a class="white" href="/tupian/26783.html" target="_blank">白菜,你好,我是黑菜</a>
        <a class="white" href="/tupian/26783.html" target="_blank">白菜,你好,你好</a>
        <a class="white" href="/tupian/26783.html" target="_blank">我是一个小白菜</a>
        <a class="white" href="/tupian/26783.html" target="_blank">大白菜</a>
        <a class="black" href="/tupian/26783.html" target="_blank">黑彩</a>
    </li>
</ul>
'''
# 初始化
doc = pq(text)
# 1: 选择一个a节点
a_tag = doc('.black')
print(type(a_tag.siblings('.white')))

结果如下:

<class 'pyquery.pyquery.PyQuery'>

因此,需要使用特殊的方法进行遍历,即xxx.items(),这个方法的作用是得到一个生成器,可以循环调用,如下:

#导包
from pyquery import PyQuery as pq
# 初始化
text = '''
<ul class="clearfix">
    <li>
        <div class="test">
            <a class="son" href="/tupian/26783.html" target="_blank">直接子节点</a>
            <div>
                <a class="hello" href="/tupian/26783.html" target="_blank">不是直接子节点</a>
            </div>
            <a class="son" href="/tupian/26783.html" target="_blank">直接子节点</a>
        </div>
        <a class="white" href="/tupian/26783.html" target="_blank">白菜,你好,我是黑菜</a>
        <a class="white" href="/tupian/26783.html" target="_blank">白菜,你好,你好</a>
        <a class="white" href="/tupian/26783.html" target="_blank">我是一个小白菜</a>
        <a class="white" href="/tupian/26783.html" target="_blank">大白菜</a>
        <a class="black" href="/tupian/26783.html" target="_blank">黑彩</a>
    </li>
</ul>
'''
# 初始化
doc = pq(text)
a_tags = doc('.white')
print(type(a_tags.items()))
print('-'*50)
for a in a_tags.items():
    print(a)

结果如下:

<class 'generator'>
--------------------------------------------------
<a class="white" href="/tupian/26783.html" target="_blank">白菜,你好,我是黑菜</a>
        
<a class="white" href="/tupian/26783.html" target="_blank">白菜,你好,你好</a>
        
<a class="white" href="/tupian/26783.html" target="_blank">我是一个小白菜</a>
        
<a class="white" href="/tupian/26783.html" target="_blank">大白菜</a>

五、获取信息

提取到元素后就要获取信息,方法如下:

获取属性:

方法:xxx.attr('属性名字')

示例:

#导包
from pyquery import PyQuery as pq
# 初始化
text = '''
<ul class="clearfix">
    <li>
        <div class="test">
            <a class="son" href="/tupian/26783.html" target="_blank">直接子节点</a>
            <div>
                <a class="hello" href="/tupian/26783.html" target="_blank">不是直接子节点</a>
            </div>
            <a class="son" href="/tupian/26783.html" target="_blank">直接子节点</a>
        </div>
        <a class="white" href="/tupian/26783.html" target="_blank">白菜,你好,我是黑菜</a>
        <a class="white" href="/tupian/26783.html" target="_blank">白菜,你好,你好</a>
        <a class="white" href="/tupian/26783.html" target="_blank">我是一个小白菜</a>
        <a class="white" href="/tupian/26783.html" target="_blank">大白菜</a>
        <a class="black" href="/tupian/26783.html" target="_blank">黑彩</a>
    </li>
</ul>
'''
# 初始化
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 = '''
<ul class="clearfix">
    <li>
        <div class="test">
            <a class="son" href="/tupian/26783.html" target="_blank">直接子节点</a>
            <div>
                <a class="hello" href="/tupian/26783.html" target="_blank">不是直接子节点</a>
            </div>
            <a class="son" href="/tupian/26783.html" target="_blank">直接子节点</a>
        </div>
        <a class="white" href="/tupian/26783.html" target="_blank">白菜,你好,我是黑菜</a>
        <a class="white" href="/tupian/26783.html" target="_blank">白菜,你好,你好</a>
        <a class="white" href="/tupian/26783.html" target="_blank">我是一个小白菜</a>
        <a class="white" href="/tupian/26783.html" target="_blank">大白菜</a>
        <a class="black" href="/tupian/26783.html" target="_blank">黑彩</a>
    </li>
</ul>
'''
# 初始化
doc = pq(text)
# 1: 获取div(class=test)标签
div_tag = doc('.test')
print(div_tag.text())

结果如下:

# 不包含节点信息,只是一个字符串,而不是三个
直接子节点
不是直接子节点
直接子节点

多个节点:

#导包
from pyquery import PyQuery as pq
# 初始化
text = '''
<ul class="clearfix">
    <li>
        <div class="test">
            <a class="son" href="/tupian/26783.html" target="_blank">直接子节点</a>
            <div>
                <a class="hello" href="/tupian/26783.html" target="_blank">不是直接子节点</a>
            </div>
            <a class="son" href="/tupian/26783.html" target="_blank">直接子节点</a>
        </div>
        <a class="white" href="/tupian/26783.html" target="_blank">白菜,你好,我是黑菜</a>
        <a class="white" href="/tupian/26783.html" target="_blank">白菜,你好,你好</a>
        <a class="white" href="/tupian/26783.html" target="_blank">我是一个小白菜</a>
        <a class="white" href="/tupian/26783.html" target="_blank">大白菜</a>
        <a class="black" href="/tupian/26783.html" target="_blank">黑彩</a>
    </li>
</ul>
'''
# 初始化
doc = pq(text)
# 1: 获取div(class=test)标签
a_tags = doc('.white')
print(a_tags.text())

结果如下:

白菜,你好,我是黑菜 白菜,你好,你好 我是一个小白菜 大白菜
# 一个字符串,不用标签之间以空格隔开

方法二:xxx.html()

作用:返回字符串,包含节点信息,如果选中多个节点,返回第一个节点的文本。

如下:

#导包
from pyquery import PyQuery as pq
# 初始化
text = '''
<ul class="clearfix">
    <li>
        <div class="test">
            <a class="son" href="/tupian/26783.html" target="_blank">直接子节点</a>
            <div>
                <a class="hello" href="/tupian/26783.html" target="_blank">不是直接子节点</a>
            </div>
            <a class="son" href="/tupian/26783.html" target="_blank">直接子节点</a>
        </div>
        <a class="white" href="/tupian/26783.html" target="_blank">白菜,你好,我是黑菜</a>
        <a class="white" href="/tupian/26783.html" target="_blank">白菜,你好,你好</a>
        <a class="white" href="/tupian/26783.html" target="_blank">我是一个小白菜</a>
        <a class="white" href="/tupian/26783.html" target="_blank">大白菜</a>
        <a class="black" href="/tupian/26783.html" target="_blank">黑彩</a>
    </li>
</ul>
'''
# 初始化
doc = pq(text)
# 1: 单个节点
div_tag = doc('.test')
print(div_tag.html())
print('-'*50)
#2 : 多个节点
a_tags = doc('.white')
print(a_tags.html())

结果如下:

  <a class="son" href="/tupian/26783.html" target="_blank">直接子节点</a>
            <div>
                <a class="hello" href="/tupian/26783.html" target="_blank">不是直接子节点</a>
            </div>
            <a class="son" href="/tupian/26783.html" target="_blank">直接子节点</a>
        
--------------------------------------------------
白菜,你好,我是黑菜

六、节点操作

节点操作,主要用于信息提取中,有时候可以有效去掉杂质信息。

方法一:改变class属性值

添加class属性:xxx.addClass('class值')

删除class属性:xxx.removeClass('class属性值')

方法二:改变属性值

方法:xxx.attr('属性名字','属性值')

方法三:改变标签内容

方法:xx.text('只改变文本')

方法:xxx.html('可以写html代码或者文本')

方法四:删除节点

方法:xxx.remove()

以上四种方法只要用于提取信息,因为有时候我们提取的信息有一些杂质,我们可以把这些杂质删除或者修改class值等等来达到提纯的目的。

pyquery库就到此为止,这个库建议学习过css的同学来用,谢谢大家。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

python慕遥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值