BeautifulSoup的使用

本文介绍了Python的BeautifulSoup库,用于解析HTML和XML文档。讲解了基本元素如Tag、Attributes、NavigableString和Comment,以及如何使用find_all和find方法查找元素。此外,还展示了如何通过CSS选择器进行搜索,并提供了两个实例,分别演示了从豆瓣电影页面抓取电影信息和爬取星巴克饮品名称。

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

BeautifulSoup的使用

用法:
BeautifulSoup库(也称bs4库)BeautifulSoup解析html/xml文件


from bs64 import BeautifulSoup
BeautifulSoup(html代码,''html.parser')

BeautifulSoup解析器有:'html.parser','lxml'等

BeautifulSoup类的基本元素:
1.Tag标签     <></>标注开头结尾   Tag的两个重要属性name和attrs
2.Name      <p>...</p>的名字是'p',  格式tag.name   输出的值为标签本身的名称
3.Attributes        格式tag.attrs     得到的类型是一个字典
4.NavigableString       标签内非属性字符串   <>...</>中字符串    格式: tag.string
5.Comment   首先类型,是否为 Comment 类型,然后再进行其他操作

BeautifulSoup提供了find_all(name,attrs(要用字典形式展现出来),text,)方法    返回一个列表类型
BeautifulSoup也支持css来搜索,不过要用"class_="这样的形式,因为class在python中是一个保留关键字
实例:解析本地HTML文件
from bs4 import BeautifulSoup
soup=BeautifulSoup(open('test.html',encoding='utf-8',),'lxml')
  • 根据标签名查找节点

    print(soup.a)		#得到的是第一个符合条件的数据
    
  • 获取标签的属性和属性值

    print(soup.a.attrs)		#是基于第一个符合条件的数据上获取属性(/值)	以列表形式返回
    
bs4的一些函数
  • find

    print(soup.find('a'))
    
    print(soup.find('a',title='a2'))	# 根据title的值来找到对应的标签对象
    
    print(soup.find('a',class_='a1'))		# 根据class的值来找到对应的标签对象,写成class_才不会报错
    
  • find_all 返回的是一个列表

    print(soup.find_all('a'))	#返回了所有的a标签
    
    print(soup.find_all(['a','span']))		#如果想获取多个标签里的数据,那么需要在find_all的参数里传入列表
    
    print(soup.find_all('li',limit=2))	# limit的作用是查找前几个数据
    
  • select 返回的是一个列表

    print(soup.select('a'))
    
    print(soup.select('a,li'))		#找到a标签和li标签的所有对象
    
    print(soup.select('.a1'))	#class='a1'的节点数据
    
    print(soup.select('#l1'))   #id='a1'的节点数据
    
    
    • 属性选择器*------>*通过属性来寻找对应的标签

      print(soup.select('li[id]'))	# 查找到li标签中有id的标签
      
      print(soup.select('li[id="l2"]'))	# 查找到li标签中id为l2的标签
      
      
    • 后代选择器

      print(soup.select('div li'))		# 找到div下面的li
      
    • 子代选择器

      print(soup.select('div > ul > li'))
      
节点信息
  • 获取节点信息的内容 一般情况下,推荐使用get_text()

    • 如果标签对象中 只有内容,那么string和get_text()都可以使用
    • 如果标签对象中 除了内容还有标签 那么string就获取不到数据 而get_text()是可以获取到数据的
    obj=soup.select('#d1')[0]
    print(obj.string)
    print(obj.get_text())
    
  • 节点的属性

    obj=soup.select('#p1')[0]
    
    print(obj.name)		# name是标签的名字
    
    print(obj.attrs)	# 将属性值作为字典返回
    
    print(obj.attrs.get('class'))	#获取属性里的某一具体值
    
实例:豆瓣电影的获取
import requests
from bs4 import BeautifulSoup

url='https://movie.douban.com/cinema/nowplaying/xian/'
headers={
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1823.67'
}
response=requests.get(url,headers=headers)
html=response.text

soup=BeautifulSoup(html,'html.parser')
# print(soup.prettify())

#获取电影的id、data-title、data-score、data-director、data-actors
movie_list=soup.find_all('li',attrs={"class":"list-item"})#或写成class_="list-item"
# print(len(movie_list))   #47

movie_infos=[]
for item in movie_list:
    infos = {}
    infos['id']=item['id']
    infos['data-title']=item['data-title']
    # infos['data-score']=item['data-score']
    infos['data-director']=item['data-director']
    infos['data-actors']=item['data-actors']
    movie_infos.append(infos)
    
with open('movies.txt','w',encoding='utf-8') as fp:
    for item in movie_infos:
        fp.write(str(item)+'\n')
实例:爬取星巴克饮品名称
import  requests
from bs4 import BeautifulSoup

url='https://www.starbucks.com.cn/menu/'
headers={
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36 Edg/115.0.1901.183'
}
response=requests.get(url,headers=headers).text

# <strong>阿馥奇朵™</strong>
soup=BeautifulSoup(response,'html.parser')
# soup.select('ul[class="grid padded-3 product"] li')
datas=soup.select('ul[class="grid padded-3 product"] strong')
for data in datas:
    print(data.get_text())
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值