30. PyQuery: 基于HTML的CSS选择器

目录

前言 

导包

基本用法

按标签选择

标签链式操作

简便链式:后代选择器

类选择器 

id 选择器 

属性/文本选择器(重点)

改进多标签拿属性方法

快速总结

PyQuery的强大功能:修改源代码

添加代码块

修改/添加属性

删除属性/标签等

总结


前言 

我们在前面的章节认识了CSS与CSS选择器的概念, 本节我们介绍一个Python模块: PyQuery. 

可能有些小伙伴认识Java中的JQuery, 其实PyQuery和它是异曲同工的. 


导包

from pyquery import PyQuery


基本用法

常用的就下列几种:

 下面通过实例讲解:

html = """
    <ul>
       <li class="aaa"><a href="http://www.google.com">谷歌</a></li>
       <li class="aaa"><a href="http://www.baidu.com">百度</a></li>
       <li class="bbb" id="qq"><a href="http://www.qq.com">腾讯</a></li>
       <li class="bbb"><a href="http://www.csdn.net">CSDN</a></li>
   </ul>
"""

# 加载html内容
p = PyQuery(html)

print(p)
print(type(p))

导入一段简单的html,用PyQuery接口加载html内容,打印看输出结果,发现就是html本身的内容。那么再打印一次它的类型,看看是不是什么都没有做,发现它是PyQuery类

PyQuery对象有什么用呢?

它可以把html加载起来,随后就可以在其后进行CSS选择器的操作了。

关于CSS选择器的知识点我们在上一节已经讲过,不懂的同学可以移步上一行的超链接传送门。

按标签选择

# pyquery对象直接(css选择器)

a = p("a")
print(a)
print(type(a))  # 依然是pyquery对象

可以筛选出所有a标签对象,而筛选结果依然是PyQuery对象,由此我们可以得出下例。

标签链式操作

# 链式操作
a = p("li")("a")
print(a)

 

由于筛选后还是PyQuery对象,所以我们可以继续筛选。上述例子就是先筛选出 li 标签,再在其中筛选 a 标签并打印输出。

简便链式:后代选择器

a = p("li a")
print(a)

这样的输出结果和上面是一样的。用了CSS选择器的语法:后代选择器,筛选包含在 li 标签的所有 a 标签。

类选择器 

a = p(".aaa a")  # class="aaa"
print(a)

查询结果为class为aaa的标签下包含的所有 a 标签。

id 选择器 

a = p("#qq a")  # id="qq"
print(a)

查询结果为 id 为 qq 的标签下包含的所有 a 标签。

属性/文本选择器(重点)

href = p("#qq a").attr('href')  # 拿属性
text = p("#qq a").text()  # 拿文本
print(href)
print(text)

查询结果为 id 为 qq 的标签下包含的 a 标签的 href 属性和它所包含的文本内容。

注意:如果多个标签同时拿属性,只能拿到第一个:

# 坑, 如果多个标签同时拿属性. 只能默认拿到第一个
href = p("li a").attr("href")
print(href)

多个标签同时拿属性,找到一个就返回了,不能这样写。

改进多标签拿属性方法

# 多个标签拿属性
it = p("li a").items()
for item in it:  # 从迭代器中拿到每一个标签
    href = item.attr("href")  # 拿到href属性\
    text = item.text()
    print(text, href)

用items()方法将标签化为列表,然后用循环的方法遍历列表,抓到每一个里面的href属性打印输出即可。

快速总结

1. pyquery(选择器)
2. items()  当选择器选择的内容很多的时候. 需要一个一个处理的时候
3. attr(属性名)  获取属性信息
4. text() 获取文本


PyQuery的强大功能:修改源代码

PyQuery和其他查询最大的区别就在于它可以修改网页源代码让他变得“整齐”,也就便于我们抓取信息等操作。

如下例所示:

添加代码块

html = """
<HTML>
    <div class="aaa">哒哒哒</div>
    <div class="bbb">嘟嘟嘟</div>
</HTML>
"""

p = PyQuery(html)

# 在xxxx标签后面添加xxxxx新标签
p("div.aaa").after("""<div class="ccc">吼吼吼</div>""")
p("div.aaa").append("""<span>我爱你</span>""")
print(p)

上述代码第11行的含义是在aaa类的div标签后面添加一行after里包含的代码块;

上述代码第12行的含义是在aaa类的div标签内部添加一行append里包含的代码块。

修改/添加属性

p("div.bbb").attr("class", "ccc")  # 修改属性
p("div.ccc").attr("id", "12306")  # 新增属性, 前提是该标签没有这个属性
print(p)

修改/添加属性用的都是 .attr() 这个方法 ,如果有这个属性,那么对应的就是修改,没有就是新增。

其实可以类比Python的字典键值对,很好理解。

删除属性/标签等

p("div.ccc").remove_attr("id")  # 删除属性
p("div.aaa").remove()  # 删除标签
print(p)

上述代码移除了class为ccc的div的id属性,和class为aaa的div标签本身。 

 

可以用上述方法分别移除筛选出的标签本身、标签属性、标签类、标签名字域(不常用)。


总结

本节我们讨论了PyQuery的基本用法和他的特殊之处,下一节将进行实战练习,用实例展示何时用PyQuery最合适。(也就是我们提到的让源代码变得“整齐”而使信息容易提取)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Vec_Kun

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

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

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

打赏作者

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

抵扣说明:

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

余额充值