输入关键字 抓取所有网页(《BeautifulSoup库使用解析》库的使用方法与解析)

优采云 发布时间: 2022-02-18 20:21

  输入关键字 抓取所有网页(《BeautifulSoup库使用解析》库的使用方法与解析)

  BeautifulSoup 库使用解析

  一、前言

  BeautifulSoup 是一个 html 文档解析库,在爬虫解析数据时非常有用。接下来,记录它的使用情况。

  二、准备导入库创建beautifulSoup对象

  file = open("./Test.html",encoding="utf-8")

soup = BeautifulSoup(file,"html.parser")

  content = '''

百度一下,你就知道

新闻

hao123

地图

视频

贴吧

更多产品

'''

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() 来完成搜索,不是很熟悉。我不会写...

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线