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

本文介绍了Python网页解析库BeautifulSoup的基本概念和主要功能,包括四大对象类型:Tag、NavigableString、BeautifulSoup和Comment。讲解了如何安装、使用BeautifulSoup,以及如何通过find_all和find方法提取HTML中的信息。此外,还提到了CSS选择器的使用和遍历文档树的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、BeautifulSoup库简介

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

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

二、解析库

d47b6625ff353e1f8514fa7d0e56117c.png

三、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

67045d7dc0a11e2f2bc889c7c38487e1.png

2、基本用法

2.1【基本用法:提取html中的信息】

(1)导入:from bs4 import BeautifulSoup

(2)将html传入解析器

方式一:

f83851f5111021eb16af6a0bdce99e2d.png

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)查看一下输出内容

d1a2060310322dc0113a5916b2ad0b73.png

(3)格式化html结构:bs.prettify()

47998dcd0c1420a17c3dd74607fc0a5a.png

为了解决返回结果是乱码,在前面添加一行代码:

r.encoding = r.apparent_encoding

665f155dc183a63d2ae9f3a425f00072.png

(4)获取标签及其内容、名称、内容

获取title标签及其内容:bs.title

获取title标签的name(没有内容时,返回None):bs.title.name

获取title标签的所有内容(不包括标签):bs.title.string 或者 bs.title.get_text()

aabec817ceaff64b61c26c3a2cf16653.png

获取title标签的父标签(即head标签)及其内容、name、内容

752f6ac12c965ad3518a1b9249f90ccb.png

获取title标签的父标签的父标签(即html标签)及其内容、name、内容

8587abf24e2cda4ac8f91d309654cded.png

(5)当相同标签有多个时,默认获取的是第一个标签

获取第一个div标签及其内容:bs.div

d3999251326602ea33a6702843e7dd48.png

获取第一个div标签的id属性:bs.div["id"]

91dbb3226be53cb081875401dc14a9ef.png

(6)find_all(name, attrs, recursive, text, **kwargs),根据标签名、属性、内容查找文档,返回所有符合条件的内容,默认获取的是第一个

通过标签名称获取

recursive表示是否对子孙全部检索,默认为True。

bs.find_all('标签')--------返回的是列表

bs.find_all('标签')[1]

e14204ddfc98fc229f768c02fb16a472.png

bs.find_all(['标签1', '标签2'])

注:会从上到下依次查找标签1或者标签2,如果标签1含有子孙节点标签2,则先输出外层的父标签1,然后再输出内层的子孙节点标签2,然后再依次往后续继续查找。

2903f63085a7221c84137704a7b6eb36.png

通过属性值获取

bs.find_all(attrs={'id':'lg'})

bs.find_all(attrs={'name':'ie'})

bs.find_all(id='lg')

bs.find_all(class_='mnav')

3414e3258ec8657df44ca71a8fcf8097.png

获取所有的a标签及其内容,返回列表:bs.find_all("a")

28047692c213abe345c68b9c23d588b4.png

获取所有的a标签及其内容,并遍历输出a标签中href的值,这里的"href"也可以替换为"class"或者"name"

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

print(item.get("href"))

b67ae50e33750b496553120fd88f6230.png

获取所有的a标签及其内容,并遍历输出a标签中的内容(不包括标签)

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

print(item.get_text())

06bc7c224af3fae473f18600b5a4f377.png

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

通过标签名称获取

bs.find('input')

type(bs.find('input'))

9e16a284fd998b643114a3fb15328d66.png

通过属性值获取

bs.find(attrs={'id':'lg'})

bs.find(attrs={'name':'ie'})

bs.find(id='lg')

bs.find(class_='mnav')

7c746ce9dca9c005ac37f8b1e3f6fb6a.png

(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)

30a29cd1d776b1bd320d4603b6b2ca2b.png

(10)获取标签的属性

获取标签的属性(是个字典类型):bs.标签.attrs

获取具体某个属性的值:bs.标签.attrs['属性名称']

6ee49c9977897562d94a662f108b5912.png

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())

五、遍历文档树

4df45fc0ced6bca020923cd6bb9e4627.png

【上行遍历】

1、获取span标签的父节点及其内容:bs.span.parent

78912e9b7cb24cb0cf10199ffdd19918.png

2、获取span标签的所有先祖节点的名称。注:.parents是先祖节点的迭代类型,用于循环遍历先祖节点

for parent in bs.span.parents:

if parent is None:

print(parent)

else:

print(parent.name)

8c9f94887dafa06c66bd20c2b5ce8443.png

【下行遍历】

1、子节点的列表:.contents

(1)获取Tag的所有子节点(只有儿子节点),返回一个列表:bs.标签.contents

注:对于一个标签的儿子节点,不仅包括标签节点,也包括字符串节点。

2043b6642790ac6138b03e9432a547ba.png

(2)用列表索引来获取它的某一个元素:bs.标签.contents[3]

ad3f3c8d9e39edba562b3744c11313ae.png

2、子节点的迭代类型:.children

(1)获取Tag的所有子节点(只有儿子节点),返回一个生成器:

for child in bs.标签.chidren:

print(child)

20c9e71cdf10d2322eab5aa15e49aad2.png

5489aac69dd5a5087815dceffc8be957.png

3、子孙节点的迭代类型:.descendants

(1)获取Tag的所有子孙节点(儿子节点、孙子节点等):bs.标签.descendants

for child in bs.标签.descendants:

print(child)

39851b017fd6a115a250f5c7f2ef51d2.png

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文本顺序的前面所有平行节点的标签

-------结束-------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值