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

Vec_Kun 2023-01-25 21:04:41 阅读数:810

htmlcss选择器选择pyquery

目录

前言 

导包

基本用法

按标签选择

标签链式操作

简便链式:后代选择器

类选择器 

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最合适。(也就是我们提到的让源代码变得“整齐”而使信息容易提取)

版权声明:本文为[Vec_Kun]所创,转载请带上原文链接,感谢。 https://blog.csdn.net/m0_59180666/article/details/128756728