(2.2)简单获取网页标签信息
当使用 BeautifulSoup 解析网页时,有时会想获取某个标签之间的信息,具体代码如下:
from bs4 import BeautifulSoup
创建本地文件 soup 对象
soup = BeautifulSoup(open(‘t.html’, encoding=‘utf-8’), “html.parser”)
获取标题
title = soup.title
print(‘标题:’, title)
获取头部
head = soup.head
print(‘头部:’, head)
获取 a 标签
a = soup.a
print(‘超链接内容:’, a)
获取 p 标签
p = soup.p
print(‘超链接内容:’, p)
(2.3)定位标签并获取内容
下述代码将实现获取网页所有的超链接标签及对应的 URL 内容:
from bs4 import BeautifulSoup
创建本地文件 soup 对象
soup = BeautifulSoup(open(‘t.html’, encoding=‘utf-8’), “html.parser”)
从文档中找到 的所有标签链接
for a in soup.find_all(‘a’):
print(a)
获取 的超链接
for link in soup.find_all(‘a’):
print(link.get(‘href’))
获取文字内容
for poeter in soup.find_all(‘a’):
print(poeter.get_text())
3、深入了解 BeautifulSoup
(3.1)BeautifulSoup 对象
BeautifulSoup 将复杂的 HTML 文档个转换成一个树形结构,每个节点都是 Python 对象,BeautifulSoup 官方文档将所有对象总结为 4 种:
-
Tag;
-
NavigableString;
-
BeautifulSoup;
-
Comment。
(3.1.1)Tag
Tag 对象表示 XML 或 HTML 文档中的标签,通俗地将就是 HTML 中的一个标签,该对象与 HTML 或 XML 原生文档中的标签相同。 Tag 有很多方法和属性,BeautifulSoup 中定义为 Soup.Tag,其中 Tag 为 HTML 中的标签,比如 head、title 等,其返回结果完整的标签内容,包括标签的属性和内容等。
静夜思
例如上述代码中,title、p、a 等都是标签,起始标签(、
、)和结束标签(
、from bs4 import BeautifulSoup
创建本地文件 soup 对象
soup = BeautifulSoup(open(‘t.html’, encoding=‘utf-8’), “html.parser”)
print(soup.title)
print(soup.head)
print(soup.p)
print(soup.a)
值得注意一下的是,它返回的内容是多有标签中第一个符合要求的标签。
很显然,通过 BeautifulSoup 对象即可轻松获取标签和标签内容,这比第三讲中的正则表达式要方便得多。
该段代码输出的是该对象的类型,即Tag对象
from bs4 import BeautifulSoup
创建本地文件 soup 对象
soup = BeautifulSoup(open(‘t.html’, encoding=‘utf-8’), “html.parser”)
print(type(soup.html))
Tag 属性和方法众多,其中最重要的两个属性:name 和 attrs。
(1)name
name 属性用于获取文档树的标签名字。如果想获取 head 标签名字,则使用 soup.head.name 代码即可。对于内部标签,输出的值便为标签本身的名字。BeautifulSoup 对象本是比较特殊,它的 name 为 document。
print(soup.name)
print(soup.head.name)
print(soup.title.name)
(2)attrs
一个标签(Tag)可能有多个属性,例如:
它存在两个属性:一个是 class 属性,对应的值为“poet”;另一个是 id 属性,对应的值为“link1”。Tag 属性的操作方法与 Python 字典相同,获取 p 标签的所有属性代码如下,得到一个字典类型的值。它获取的是第一个段落 p 的属性及属性值。
print(soup.p.attrs)
如果要单独获取某个属性,则可以使用如下两种方法来获取超链接的 class 属性值。
print(soup.a[‘class’])
print(soup.a.get(‘class’))
BeautifulSoup 的每个标签 Tag 可能有多个属性,可以通过 “.attrs” 获取其属性。Tag 的属性可以被修改、删除、添加。
下面举个简单的例子进行介绍:
该段代码输出的是该对象的类型,即Tag对象
from bs4 import BeautifulSoup
创建本地文件 soup 对象
soup = BeautifulSoup(‘黄建雷’, “html.parser”)
tag = soup.b
print(tag)
print(type(tag))
NAME
print(tag.name)
print(tag.string)
Attributes
print(tag.attrs)
print(tag[‘class’])
print(tag.get(‘id’))
修改属性,增加属性name
tag[‘class’] = ‘abc’
tag[‘id’] = ‘1’
tag[‘name’] = ‘2’
print(tag)
删除属性
del tag[‘class’]
del tag[‘name’]
print(tag)
print(tag[‘class’]) # 此语句会报错
(3.1.2)NavigableString
前面介绍了如何获取标签的 name 和 attrs,如果想获取标签对应的内容,可以使用 string 属性获取。
from bs4 import BeautifulSoup
创建本地文件 soup 对象
soup = BeautifulSoup(open(‘t.html’, encoding=‘utf-8’), “html.parser”)
print(soup.a[‘class’])
print(soup.a.string)
由上述代码可以看出,利用 string 属性获取标签 <> 和 </> 之间的内容要比利用正则表达式方便得多。
BeautifulSoup 用 NavigableString 类来包装 Tag 中的字符串,其中,NavigableString 表示可遍历的字符串。一个 NavigableString 字符串与 Python 中的 Unicode 字符串相同,并且支持包含在遍历文档树和搜索文档树中的一些特性。
该段代码用来查看 NavigableString 的类型
from bs4 import BeautifulSoup
创建本地文件 soup 对象
soup = BeautifulSoup(open(‘t.html’, encoding=‘utf-8’), “html.parser”)
tag = soup.title
print(type(tag.string))
当然,通过 unicode() 方法可以直接将 NavigableString 对象转化成 Unicode 字符串。
from bs4 import BeautifulSoup
创建本地文件 soup 对象
soup = BeautifulSoup(open(‘t.html’, encoding=‘utf-8’), “html.parser”)
tag = soup.title
unicode_string = tag.string
print(unicode_string)
最后再说明一点,标签中包含的字符串不能编辑,但是可以被替换成其他的字符串,用 replace_with() 方法即可实现。
tag.string.replace(“替换前的内容”, " 替换后的内容 ")
from bs4 import BeautifulSoup
创建本地文件 soup 对象
soup = BeautifulSoup(open(‘t.html’, encoding=‘utf-8’), “html.parser”)
tag = soup.title
unicode_string = tag.string
print(unicode_string)
a = tag.string.replace(“BeautifulSoup 技术”, " NavigableString ")
print(a)
(3.1.3)BeautifulSoup对象
BeautifulSoup 对象表示的是一个文档的全部内容,通常情况下把它当做 Tag 对象。 BeautifulSoup 对象支持遍历文档树和搜索文档树中描述的大部分方法。
type(soup)
<class ‘bs4.BeautifulSoup’>
上述代码为调用 type() 函数查看 soup 变量的数据类型,即为 BeautifulSoup 对象类型。因为 BeautifulSoup 对象并不是真正的 HTML 和 XML 标签 Tag,所以它没有 name 和 attrs 属性。
但有时候查看 BeautifulSoup 对象的 “.name ” 属性是很方便的,因为其包含了一个值为“[ document ]”的特殊属性——soup.name。
soup.name
[document]
(3.1.4) Comment
Comment 对象是一个特殊类型的 NavigableString 对象,用于处理注释对象。
本段代码用于读取注释内容
from bs4 import BeautifulSoup
markup = “ ”
soup = BeautifulSoup(markup, “html.parser”)
comment = soup.b.string
print(type(comment))
print(comment)
(3.2) 遍历文档树
在 BeautifulSoup 中,一个标签可能包含多个字符串或其他的标签,这些称为该标签的子标签。
( 3.2.1) 子节点
在 BeautifulSoup 中通过 contents 值获取标签的子节点内容,并以列表的形式输出。
本段代码用于获取 标签子节点内容
from bs4 import BeautifulSoup
创建本地文件 soup 对象
soup = BeautifulSoup(open(‘t.html’, encoding=‘utf-8’), “html.parser”)
print(soup.head.contents)
由于 和 之间存在两个换行,所以获取的列表包括两个换行,如果需要提取某个元素,代码如下:
print(soup.head.contents[3])
当然,也可以使用 children 关键字获取,但它返回的不是一个列表,而是可以通过遍历的方法获取所有子节点的内容。
print(soup.head.children)
for child in soup.head.children:
print(child)
前面介绍的 contents 和 children 属性仅包含标签的直接子节点,如果需要获取 Tag 的所有子节点,甚至是子孙节点,则需要使用 descendants 属性。
for child in soup.descendants:
print(child)
很显然,所有的 HTML 标签都打印出来了。
(3.2.2) 节点内容
如果标签只有一个子节点,且需要获取该子节点的内容,则使用 string 属性输出子节点的内容,通常返回嘴里层的标签内容。
本段代码用于获取标题内容
from bs4 import BeautifulSoup
创建本地文件 soup 对象
soup = BeautifulSoup(open(‘t.html’, encoding=‘utf-8’), “html.parser”)
print(soup.head.string)
print(soup.title.string)
从上述代码可以看出,当标签含有多个子节点时(内容包括两个换行元素),Tag 就无法确定 string 获取那个子节点的内容,此时输出的结果就是 None 。
若需要获取多个节点内容,则使用 strings 属性。
for content in soup.strings:
print(content)
做了那么多年开发,自学了很多门编程语言,我很明白学习资源对于学一门新语言的重要性,这些年也收藏了不少的Python干货,对我来说这些东西确实已经用不到了,但对于准备自学Python的人来说,或许它就是一个宝藏,可以给你省去很多的时间和精力。
别在网上瞎学了,我最近也做了一些资源的更新,只要你是我的粉丝,这期福利你都可拿走。
我先来介绍一下这些东西怎么用,文末抱走。
(1)Python所有方向的学习路线(新版)
这是我花了几天的时间去把Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
最近我才对这些路线做了一下新的更新,知识体系更全面了。
(2)Python学习视频
包含了Python入门、爬虫、数据分析和web开发的学习视频,总共100多个,虽然没有那么全面,但是对于入门来说是没问题的,学完这些之后,你可以按照我上面的学习路线去网上找其他的知识资源进行进阶。
(3)100多个练手项目
我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了,只是里面的项目比较多,水平也是参差不齐,大家可以挑自己能做的项目去练练。
(4)200多本电子书
这些年我也收藏了很多电子书,大概200多本,有时候带实体书不方便的话,我就会去打开电子书看看,书籍可不一定比视频教程差,尤其是权威的技术书籍。
基本上主流的和经典的都有,这里我就不放图了,版权问题,个人看看是没有问题的。
(5)Python知识点汇总
知识点汇总有点像学习路线,但与学习路线不同的点就在于,知识点汇总更为细致,里面包含了对具体知识点的简单说明,而我们的学习路线则更为抽象和简单,只是为了方便大家只是某个领域你应该学习哪些技术栈。
(6)其他资料
还有其他的一些东西,比如说我自己出的Python入门图文类教程,没有电脑的时候用手机也可以学习知识,学会了理论之后再去敲代码实践验证,还有Python中文版的库资料、MySQL和HTML标签大全等等,这些都是可以送给粉丝们的东西。
这些都不是什么非常值钱的东西,但对于没有资源或者资源不是很好的学习者来说确实很不错,你要是用得到的话都可以直接抱走,关注过我的人都知道,这些都是可以拿到的。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!