输入关键字 抓取所有网页(《BeautifulSoup库使用解析》库的使用方法与解析)
优采云 发布时间: 2022-02-18 20:21输入关键字 抓取所有网页(《BeautifulSoup库使用解析》库的使用方法与解析)
BeautifulSoup 库使用解析
一、前言
BeautifulSoup 是一个 html 文档解析库,在爬虫解析数据时非常有用。接下来,记录它的使用情况。
二、准备导入库创建beautifulSoup对象
file = open("./Test.html",encoding="utf-8")
soup = BeautifulSoup(file,"html.parser")
content = '''
百度一下,你就知道
更多产品
'''
soup = BeautifulSoup(content,"html.parser")
这个比较常用,但是在实际使用中,内容会被网页实时捕捉到的文本内容替换掉。
接下来,我们就以上面的文字作为数据源来说明,下面所有的方法都是基于这篇文字的分析
三、 类型 BeautifulSoup 类型
我们刚刚创建的汤对象是 BeautifulSoup 类型。可以打印
print(type(soup))
输出:
标签类型
tag类型是一个很重要的类型,那么什么是Tag呢,它类似于xml中的一个标签,如下图
新闻
hao123
标签可以分为三个部分:名称、属性和字符串。结构如图
#获得找到的第一个名字为a的标签
print(soup.a)
#结果: 新闻
#打印名字
print(soup.a.name)
#结果:a
#打印属性
print(soup.a.attrs)
#结果:{'class': ['mnav'], 'href': 'http://news.baidu.com', 'name': 'tj_trnews'}
#打印内容
print(soup.a.string)
#结果:新闻
NavigableString 和 Comment 类型
这两个其实就是Tag的字符串内容。不同的是,如果内容是全注释的,则为 Comment 类型;否则,它是 NavigableString 类型
百度一下,你就知道
print(type(soup.title.string))
#结果:
print(type(soup.ha.string))
#结果:
print(soup.title.string)
#结果:百度一下,你就知道
print(soup.ha.string)
#结果:我是注释里的内容
#注意上面这里直接获得了注释里的内容
四、 遍历
我们可以通过名称获取标签。
遍历直接子节点内容
for item in soup.head.contents:
print(item.name)
'''
结果:
None
meta
None
meta
None
meta
None
link
None
title
None
ha
None
'''
可以看到子标签都打印出来了(里面会有一些none节点)
children 遍历所有子节点后代
前面的内容得到的直接子节点和children不能得到孙节点。并且后代可以获取所有子节点
for item in soup.body.descendants:
print(item.name)
遍历父节点 遍历兄弟节点 前后遍历
与兄弟节点的遍历不同,这里的前向和后向遍历都可以到达子节点。从根节点向后遍历,可以到达所有节点。
五、搜索 find_all() 指定名称
#查找 name=“a” 的所有标签
alla = soup.find_all(name="a")
for a in alla:
print(a)
结果
新闻
hao123
地图
视频
贴吧
更多产品
上面也可以写成soup.find_all("a"),如果没有指定关键字,默认使用name作为条件
指定文本
allItem = soup.find_all(text="新闻 ")
for item in allItem:
print(item)
结果
新闻
请注意,此处找到的所有字符串都是字符串,而不是标签
指定属性
除了name、text、attrs等关键词,其他代表属性。例如
allItem = soup.find_all(href="//www.baidu.com/more/")
for item in allItem:
print(item)
结果
更多产品
如果属性与python关键字重合,比如class,需要下划线_,比如
allItem = soup.find_all(class_="mnav")
for item in allItem:
print(item)
结果
新闻
hao123
地图
视频
贴吧
可以添加多个条件,例如
allItem = soup.find_all(class_="mnav",href="http://news.baidu.com",name="a")
for item in allItem:
print(item)
结果
新闻
指定名单
list = {"mnav","bri"}
allItem = soup.find_all(class_=list)
for item in allItem:
print(item)
结果
新闻
hao123
地图
视频
贴吧
更多产品
指定正则表达式
allItem = soup.find_all(href =re.compile("www."))
for item in allItem:
print(item)
结果
hao123
更多产品
指定方法
要指定一个方法,可以传入一个方法作为参数,但是这个方法需要一个Tag作为参数。例如:
def has_attr_name(tag):
return tag.has_attr('name')
allItem = soup.find_all(has_attr_name)
for item in allItem:
print(item)
结果
新闻
hao123
地图
视频
贴吧
更多产品
搜索()
BeautifulSoup 也可以使用 search() 进行搜索,但是因为我刚使用 BeautifulSoup 一段时间,所以大多使用 find_all() 来完成搜索,不是很熟悉。我不会写...