您当前的位置:首页 > 计算机 > 编程开发 > Python

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

时间:05-20来源:作者:点击数:

一、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、下载安装: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文本顺序的前面所有平行节点的标签

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门