一、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文本顺序的前面所有平行节点的标签
-------结束-------
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:【Python爬虫学习(1)】BeautifulSoup库的使用 - Python技术站