Attributes
一个tag可能包含很多属性,如id、class等,操作tag属性的方式与字典相同。
例如网页中包含缩略图区域的标签 article
获取它 class 属性的值
也可以直接通过 .attrs 获取所有的属性
ps. 因为class属于多值属性,所以它的值为数组。
tag中的字符串
通过 string 方法获取标签中包含的字符串
文档树的遍历
一个Tag可能包含多个字符串或其它的Tag,这些都是这个Tag的子节点。Beautiful Soup提供了许多操作和遍历子节点的属性。
子节点
通过Tag的 name 可以获取到对应标签,多次调用这个方法,可以获取到子节点中对应的标签。
如下图:
我们希望获取到 article 标签中的 li
打印结果:
也可以把中间的一些节点省略,结果也一致
tag = soup.article.li
通过 . 属性只能获取到第一个tag,若想获取到所有的 li 标签,可以通过 find_all() 方法
ls = soup.article.div.ul.find_all(‘li’)
获取到的是包含所有li标签的列表。
tag的 .contents 属性可以将tag的子节点以列表的方式输出:
打印 contents 可以看到列表中不仅包含了 li 标签内容,还包括了换行符 ‘\n’
过tag的 .children 生成器,可以对tag的子节点进行循环
可以看到 children 的类型为
.contents 和 .children 属性仅包含tag的直接子节点,若要遍历子节点的子节点,可以通过 .descendants 属性,方法与前两者类似,这里不列出来了。
父节点
通过 .parent 属性来获取某个元素的父节点,article 的 父节点为 body。
或者通过 .parents 属性遍历所有的父辈节点。
兄弟节点
.next_sibling 和 .previous_sibling 属性用来插叙兄弟节点,使用方式与其他的节点类似。
文档树的搜索
对树形结构的文档进行特定的搜索是爬虫抓取过程中最常用的操作。
find_all()
find_all(name , attrs , recursive , string , ** kwargs)
name 参数
查找所有名字为 name 的tag
keyword 参数
如果指定参数的名字不是内置的参数名(name , attrs , recursive , string),则将该参数当成tag的属性进行搜索,不指定tag的话则默认为对所有tag进行搜索。
如,搜索所有 id 值为 footer 的标签
加上标签的参数
获取所有缩略图的 div 标签,缩略图用 class 为 thumb 标记
soup.find_all(‘div’, class_=‘thumb’)
这里需要注意一点,因为 class 为Python的保留关键字,所以作为参数时加上了下划线,为“class_”。
指定名字的属性参数值可以包括:字符串、正则表达式、列表、True/False。
True/False
是否存在指定的属性。
搜索所有带有 target 属性的标签
soup.find_all(target=True)
搜索所有不带 target 属性的标签(仔细观察会发现,搜索结果还是会有带 target 的标签,那是不带 target 标签的子标签,这里需要注意一下。)
soup.find_all(target=False)
可以指定多个参数作为过滤条件,例如页面缩略图部分的标签如下所示:
搜索 src 属性中包含 reeoo 字符串,并且 class 为 lazy 的标签:
soup.find_all(src=re.compile(“reeoo.com”), class_=‘lazy’)
搜索结果即为所有的缩略图 img 标签。
有些属性不能作为参数使用,如 data-**** 属性。在上面的例子中,data-original 不能作为参数使用,运行起来会报错,SyntaxError: keyword can’t be an expression*。
attrs 参数
定义一个字典参数来搜索对应属性的tag,一定程度上能解决上面提到的不能将某些属性作为参数的问题。
例如,搜索包含 data-original 属性的标签
print soup.find_all(attrs={‘data-original’: True})
搜索 data-original 属性中包含 reeoo.com 字符串的标签
soup.find_all(attrs={‘data-original’: re.compile(“reeoo.com”)})
搜索 data-original 属性为指定值的标签
string 参数
和 name 参数类似,针对文档中的字符串内容。
搜索包含 Reeoo 字符串的标签:
soup.find_all(string=re.compile(“Reeoo”))
打印搜索结果可看到包含3个元素,分别是对应标签里的内容,具体见下图所示
如果你也是看准了Python,想自学Python,在这里为大家准备了丰厚的免费学习大礼包,带大家一起学习,给大家剖析Python兼职、就业行情前景的这些事儿。
一、Python所有方向的学习路线
Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
二、学习软件
工欲善其必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。
三、全套PDF电子书
书籍的好处就在于权威和体系健全,刚开始学习的时候你可以只看视频或者听某个人讲课,但等你学完之后,你觉得你掌握了,这时候建议还是得去看一下书籍,看权威技术书籍也是每个程序员必经之路。
四、入门学习视频
我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。
四、实战案例
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
五、面试资料
我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
成为一个Python程序员专家或许需要花费数年时间,但是打下坚实的基础只要几周就可以,如果你按照我提供的学习路线以及资料有意识地去实践,你就有很大可能成功!
最后祝你好运!!!
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
nvert/6c361282296f86381401c05e862fe4e9.png)
成为一个Python程序员专家或许需要花费数年时间,但是打下坚实的基础只要几周就可以,如果你按照我提供的学习路线以及资料有意识地去实践,你就有很大可能成功!
最后祝你好运!!!
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!