1. 遍历文档树

        在解析文档文件的过程中,如果需要遍历文档,我们需要使用到一些特殊的方法。

        例如:

        1) .contents

        获取Tag的所有子节点,以列表的形式返回。

        例如:

con =  soup.head.contents
for i in con:
    print(i)

        先把tag的.content对象以列表的形式存储在con中,然后通过遍历来查看其中的元素。

        2) .children

        获取Tag的所有子节点,存储在一个生成器中,可以直接通过遍历的方式来访问,和上面例子一致。

        3) .descendants

        获取Tag的所有子孙节点。

        4) .strings

        获取子孙节点中的所有内容,可以通过遍历的方式来访问。

        5) .parent

        获取到Tag标签的父节点。

        6) .parents

        递归得到所有父辈节点,存放在一个生成器中,可以通过遍历的方式来访问。

        7) .previous_siblings

        获取Tag上面的所有兄弟节点,返回生成器。

        8) .next_siblings

        获取Tag下面的所有兄弟节点,返回生成器。

        9) .has_attr

        用于判断Tag是否包含属性。

2. 搜素文档树

        我们在使用的过程中如果要匹配到搜索内容的全部信息,这时候就需要搜索整个文档树,我们需要采用到find_all方法,这个过滤器能贯穿整个搜索的AIP,它可以使用在tag的name中,它的语法格式为:

find_all( name , attrs , recursive , text , **kwargs )

        name参数即tag的名字,attrs为类或id,recursive为递归性,text为文本参数。

        我们对于下面一段网页信息进行学习使用。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>C语言网</title>
</head>
<body>
<div id = "contnt">
    <div id="top">
            <div id="dot">
            <a class="dotcpp" href="http://news.baidu.com" name="jc">教程</a>
            <a class="dotcpp" href="https://www.dotcpp.com/wp/" name="zy">资源</a>
            <a class="dotcpp" href="https://blog.dotcpp.com/" name="bk">博客</a>
            <a class="dotcpp" href="https://www.dotcpp.com/team/" name="xz">小组 </a>
            <a class="dotcpp" href="https://www.dotcpp.com/wp/#" name="xl">训练 </a>
            <a class="dotcpp" href="https://www.dotcpp.com/oj/contest.html" name="bs">比赛 </a>
          </div>
    </div>
</div>
</body>
</html>

        1) name

        name对应的是标签的名字,我们可以通过函数判断名字的存在,来遍历文档中的所有name标签的相关信息。

from bs4 import BeautifulSoup
soup = BeautifulSoup(html,"html.parser")
def name_is_exists(tag):
    return tag.has_attr("name")
s = soup.find_all(name_is_exists)
for i in s:
    print(i)

        输出结果为:

<a class="dotcpp" href="http://news.baidu.com" name="jc">教程</a>
<a class="dotcpp" href="https://www.dotcpp.com/wp/" name="zy">资源</a>
<a class="dotcpp" href="https://blog.dotcpp.com/" name="bk">博客</a>
<a class="dotcpp" href="https://www.dotcpp.com/team/" name="xz">小组 </a>
<a class="dotcpp" href="https://www.dotcpp.com/wp/#" name="xl">训练 </a>
<a class="dotcpp" href="https://www.dotcpp.com/oj/contest.html" name="bs">比赛 </a>

        通过这个简单的例子我们筛选出了具备name名字的所有标签并输出。

        2) attrs

        因为在一个html文档中有很多属性,我们想要筛选到我们想要的信息,也可以通过属性的不同来筛选,我们如果把最后文档中最后一个比赛的中的class内容改为:

<a href="https://www.dotcpp.com/oj/contest.html" name="bs" >比赛 </a>

        然后我们通过标签的选择,可以直接获取到这条标签的内容,代码如下:

from bs4 import BeautifulSoup
soup = BeautifulSoup(html,"html.parser")
s = soup.find_all(attrs={"class":"dot"})
for item in s:
    print(item)

        输出结果为:

<a class="dot" href="https://www.dotcpp.com/oj/contest.html" name="bs">比赛 </a>

        3) Text

        Text参数可以搜索文档中的字符串内容,与name参数的可选值一致,也可以通过正则表达式筛选,我们继续对上面的html文件进行过滤,代码如下:

from bs4 import BeautifulSoup
soup = BeautifulSoup(html,"html.parser")
t_list = soup.find_all(text=["比赛", "博客", "训练"])
for item in t_list:
    print(item)

        输出结果为:

博客
训练
比赛

        在使用的时候还会使用到find()方法,它会返回符合条件的第一个Tag,我们在筛选一条符合要求的信息时可以采用find()方法,当然我们也可以在find_all()中通过limit 参数来限定为‘1’来进行查找,如下面例子中,它们对应的是同一信息。

ts = soup.find_all("title",limit=1) 
print(ts) 
t = soup.find("title") 
print(t)

3. 总结

        BeautifulSoup在我们解析网页的时候简单好用,能够帮助我们快速的找到相应的信息,相应的语法也比较基础,常用的一些内容我们基本介绍完了,如果想要了解更多内容可以通过相关文档进一步的学习。https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/ 


点赞(0)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)