目录
前言
导包
基本用法
按标签选择
标签链式操作
简便链式:后代选择器
类选择器
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最合适。(也就是我们提到的让源代码变得“整齐”而使信息容易提取)