Python爬虫——解析常用三种方式之BeautifulSoup

目录

简介

优缺点

安装以及创建

1.安装

2.导入

3.创建对象

基础语法

案例:使用bs4爬取茶百道官网新品图片以及对应名称

总结


beautifulSoup简称——bs4

简介

        Beautiful Soup是一个Python库,用于网络爬虫,用于从HTML和XML文件中提取数据。它提供了一种浏览、搜索和修改HTML或XML文档解析树的方式。Beautiful Soup通过提供一种Pythonic的方式与HTML或XML内容进行交互,使得从网页中抓取信息变得容易。它可以处理错误的标记,并可以将输入的文档转换为Unicode,输出的文档转换为UTF-8。

         简而言之就是beautifulsoup和lxml一样都是一个html的解析器,主要功能也是解析和提取数据。

优缺点

        缺点:效率没有lxml的效率高

        优点:接口设计人性化,使用比较方便

安装以及创建

1.安装

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ bs4

2.导入

from bs4 import BeautifulSoup

3.创建对象

服务器响应的文件生成对象

soup = BeautifuleSoup(response.read().decode(), 'lxml')

本地文件生成对象

soup = BeautifulSoup(open('1.html'), 'lxml')

注意:默认打开文件的编码格式是GBK,所以需要指定打开编码格式

基础语法

直接看下面的代码, 有非常详细的注释,

我们的html文件内容如下

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <div>
        <ul>
            <li id="zs">张三</li>
            <li>李四</li>
            <li id="">王五</li>
            <a href="" id="wj" class="go">WenJGo</a>
            <span class="hh">^_^哈哈哈</span>
        </ul>
    </div>
    
    <a href="" title="aa">baidu</a>

</body>
</html>

python代码如下,这里面有详细的使用方法以及注释

from bs4 import BeautifulSoup

# 通过解析本地文件 来bs4基础语法进行讲解
# 默认打开问价你的编码格式是GBK,所以在打开文件的时候需要指定编码
soup = BeautifulSoup(open('22_解析_BeautifulSoup的基本使用.html', encoding='utf-8'), 'lxml')

# 根据标签名称查找节点
# 找到的是第一个符合条件的数据
print(soup.a)
# 获取标签的属性以及属性值
print(soup.a.attrs)

print('-----------------')

# bs4的一些函数
# (1)find
# 返回的是第一个符合条件的数据
print(soup.find('a'))
# 根据title的值找到对应的标签对象
print(soup.find('a', title='aa'))
# 根据class的值来找到对应的标签的对象,注意:class需要天极爱下划线
print(soup.find('a', class_='wjgo'))

print('-----------------')
# (2)find_all
# 返回的是一个列表,里面存储了所有的a标签
print(soup.find_all('a'))
# 如果想获取多个标签的数据,那抹需要在find_all的参数中添加的是列表的数据
print(soup.find_all(['a', 'span']))
# 获取前两个li,,limit的作用是查找前几个数据
print(soup.find_all('li', limit=2))

print('-----------------')
# (3)select
# select方法返回的是一个列表,并且会返回多个(全部)的数据
print(soup.select('a'))
# class就在前面加一个 '.' ,也就是可以通过'.'代表class,也就是类选择器
print(soup.select('.hh'))
# id就在前面加一个 '#' ,也就是可以通过'#'代表id,也就是id选择器
print(soup.select('#zs'))

# 属性选择器-------通过属性寻找对应的标签
# 查找li标签中右id的标签
print(soup.select('li[id]'))
# li标签中查找 id = zs 的标签
print(soup.select('li[id="zs"]'))

# 层级选择器--------
# 后代选择器
# 寻找div下面的li,' '这个空格代表后代
print(soup.select('div li'))

# 子代选择器,某标签的第一级字标签
# 由于div的儿子没有li,所以这个是空
print(soup.select('div > li'))
# 这样子写就好了
# 注意:很多的计算机语言这里,如果不加空格这里不会输出内容,但是bs4没事
print(soup.select('div > ul > li'))

# 找到a标签和li标签的所有的对象
print(soup.select('a,li'))


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

# 节点的属性
obj = soup.select('#d2')[0]
# name:标签的名字
print(obj.name)
# 将属性值作为一个字典返回
print(obj.attrs)

# 获取节点的属性
obj = soup.select('#d2')[0]
# 获取某个属性的数据
print(obj.attrs.get('class'))
# 这个方式也行
print(obj.get('class'))
# 这个方式也行
print(obj['class'])

案例:使用bs4爬取茶百道官网新品图片以及对应名称

这里我发现茶百道一点反扒都没有,所以我虽然写了UA,但是还是没有加进去

import urllib.request
from bs4 import BeautifulSoup

url = 'https://www.chabaidao.com/'

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36'
}

response = urllib.request.urlopen(url=url)

content = response.read().decode('utf-8')

# 寻找洛神山楂莓
soup = BeautifulSoup(content, 'lxml')

# xpath : //div//ul[@class="container"]//h4/text()
name_list = soup.select('.container h4')
img_list = soup.select('.container img[src]')

# 保存到本地
for i in range(len(img_list)):
    name = name_list[i].string
    img = img_list[i].attrs.get('src')
    url = 'https://www.chabaidao.com' + img

    urllib.request.urlretrieve(url=url, filename='./爬取茶百道新品名称以及照片/' + name + '.jpg')





总结

        多多练习,但是我只能说还是xpath好用,因为浏览器有xpath这个插件,你可以知道你是不是找对地方了嘿嘿,ヾ( ̄▽ ̄)Bye~Bye~

  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WenJGo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值