Python爬虫学习(1):BeautifulSoup库的使用

一、BeautifulSoup库简介

BeautifulSoup是一个灵活方便的网页解析库,处理搞笑,支持多种解析器。利用它可以不用编写正则表达式就可以方便的实现网页信息的抓取。

BeautifulSoup是爬虫必学技能,其最主要的功能是从网页抓取数据。BeautifulSoup自动的将输入文档转换为Unicode编码,输出文档转换为utf-8编码。BeautifulSoup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,如果不安装它,那么会使用Python默认的解析器。lxml解析器更加强大,速度更快,推荐使用xlml解析器。

二、解析库

在这里插入图片描述

三、BeautifulSoup4四大对象种类

BeautifulSoup4将复杂的HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种:

1、Tag

利用"bs.标签"可获取这些标签的内容(查找的是所有内容种第一个符合要求的标签),这些对象的类型是"bs4.element.Tag"。对于Tag对象,有两个重要的属性:name、attrs

2、NavigableString

得到标签的内容后,利用"bs.标签.string"获取标签内部的文字

3、BeautifulSoup

BeautifulSoup对象表示一个文档的内容。可以看作是特殊的Tag,可以分别获取它的类型,名称,属性。

4、Comment

Comment对象是一个特殊类型的NavigableString对象,其输出的内容不包括注释符号。

四、基本用法

1、下载安装BeautifulSoup4库

pip install BeautifulSoup4
在这里插入图片描述

2、基本用法

2.1、提取html中的信息

(1)导入:from bs4 import BeautifulSoup
(2)将html传入解析器

方式一:
在这里插入图片描述
bs = BeautifulSoup(html, ‘html.parser’)

方式二、
import requests
r=requests.get(“http://xxx”)
bs=BeautifulSoup(r.text, ‘html.parser’)

注1:括号里的r.text表示被解析的html格式的内容;‘html.parser’表示解析用的解析器,相应的还有其他’lxml’、‘xml’、'html5lib’等解析器
注2:print(r.text)查看一下输出内容
在这里插入图片描述
(3)格式化html结构:bs.prettify()
在这里插入图片描述
为了解决返回结果是乱码,在前面添加一行代码:
r.encoding = r.apparent_encoding
在这里插入图片描述
(4)获取标签及其内容、名称、内容
获取title标签及其内容:bs.title
获取title标签的name(没有内容时,返回None):bs.title.name
获取title标签的所有内容(不包括标签):bs.title.string 或者 bs.title.get_text()
在这里插入图片描述
获取title标签的父标签(即head标签)及其内容、name、内容
在这里插入图片描述
获取title标签的父标签的父标签(即html标签)及其内容、name、内容
在这里插入图片描述
(5)当相同标签有多个时,默认获取的是第一个标签
获取第一个div标签及其内容:bs.div
在这里插入图片描述
获取第一个div标签的id属性:bs.div[“id”]
在这里插入图片描述
(6)find_all(name, attrs, recursive, text, **kwargs),根据标签名、属性、内容查找文档,返回所有符合条件的内容,默认获取的是第一个

通过标签名称获取
recursive表示是否对子孙全部检索,默认为True。
bs.find_all(‘标签’)--------返回的是列表
bs.find_all(‘标签’)[1]
在这里插入图片描述
bs.find_all([‘标签1’, ‘标签2’])
注:会从上到下依次查找标签1或者标签2,如果标签1含有子孙节点标签2,则先输出外层的父标签1,然后再输出内层的子孙节点标签2,然后再依次往后续继续查找。
在这里插入图片描述
通过属性值获取
bs.find_all(attrs={‘id’:‘lg’})
bs.find_all(attrs={‘name’:‘ie’})
bs.find_all(id=‘lg’)
bs.find_all(class_=‘mnav’)
在这里插入图片描述
获取所有的a标签及其内容,返回列表:bs.find_all(“a”)
在这里插入图片描述
获取所有的a标签及其内容,并遍历输出a标签中href的值,这里的"href"也可以替换为"class"或者"name"

for item in bs.find_all("a"):
     print(item.get("href"))

在这里插入图片描述
获取所有的a标签及其内容,并遍历输出a标签中的内容(不包括标签)

for item in bs.find_all("a"):
     print(item.get_text())

在这里插入图片描述
(7)find(name, attrs, recursive, text, **kwargs),根据标签名、属性、内容查找文档,返回所有符合条件的内容。默认获取的是第一个

通过标签名称获取
bs.find(‘input’)
type(bs.find(‘input’))
在这里插入图片描述
通过属性值获取
bs.find(attrs={‘id’:‘lg’})
bs.find(attrs={‘name’:‘ie’})
bs.find(id=‘lg’)
bs.find(class_=‘mnav’)
在这里插入图片描述
(8)find_其他用法
  1)返回直接父节点:find_parent()
  2)返回所有祖先节点:find_parents()
  3)返回后面第一个兄弟节点:find_next_sibling()
  4)返回后面所有的兄弟节点:find_next_siblings()
  5)返回前面第一个兄弟节点:find_previous_sibling()
  6)返回前面所有的兄弟节点:find_previous_siblings()
  7)返回后面第一个符合条件的节点:find_next()
  8)返回后面所有符合条件的节点:find_all_next()
  
(9)获取类型:type(bs.标签)
type(bs.title)
type(bs.head)
在这里插入图片描述
(10)获取标签的属性
获取标签的属性(是个字典类型):bs.标签.attrs
获取具体某个属性的值:bs.标签.attrs[‘属性名称’]
在这里插入图片描述
2.2、CSS选择

通过select()直接传入CSS选择器
bs.select(’.panel .panel-heading’)
bs.select(‘ul li’)
bs.select(’#list-2 .element’)
type(bs.select(‘ul’)[0])

for ul in bs.select('ul'):
     print(ul.select('li'))
for ul in bs.select('ul'):
     print(ul['id'])
     print(ul.attrs['id'])
for li in bs.select('li'):
     print(li.get_text())

五、遍历文档树

在这里插入图片描述
【上行遍历】
1、获取span标签的父节点及其内容:bs.span.parent
在这里插入图片描述
2、获取span标签的所有先祖节点的名称。注:.parents是先祖节点的迭代类型,用于循环遍历先祖节点

for parent in bs.span.parents:
     if parent is None:
          print(parent)
     else:
          print(parent.name)

在这里插入图片描述
【下行遍历】

1、子节点的列表:.contents
(1)获取Tag的所有子节点(只有儿子节点),返回一个列表:bs.标签.contents
注:对于一个标签的儿子节点,不仅包括标签节点,也包括字符串节点。
在这里插入图片描述
(2)用列表索引来获取它的某一个元素:bs.标签.contents[3]
在这里插入图片描述
2、子节点的迭代类型:.children
(1)获取Tag的所有子节点(只有儿子节点),返回一个生成器:

for child in bs.标签.chidren:
      print(child)

在这里插入图片描述
在这里插入图片描述
3、子孙节点的迭代类型:.descendants
(1)获取Tag的所有子孙节点(儿子节点、孙子节点等):bs.标签.descendants

for child in bs.标签.descendants:
     print(child)

在这里插入图片描述
4、.strings

如果Tag包含多个字符串,即在子孙节点中有内容,可以用此获取,而后进行遍历

5、.stripped_strings

与.strings用法一致,不过可以去掉拿些

6、.has_attr
判断Tag是否包含属性

【平行遍历】
只有同一个父节点的儿子节点才能构成平行遍历的关系
1、.next_sibiling
返回按照HTML文本顺序的下一个平行节点的标签
2、.previous_sibiling
返回按照HTML文本顺序的上一个平行节点的标签
3、.next_sibilings
迭代类型,返回按照HTML文本顺序的后面所有平行节点的标签
4、.previous_sibilings
迭代类型,返回按照HTML文本顺序的前面所有平行节点的标签

-----end-----

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值