BeautifulSoup实用性的几个基本使用方法

 

本章只是本人自己为了防止遗忘而巩固的beautifulSope的几个基本且试用的方法,爬取豆瓣top250的第一条电影,相信各位小可爱如果想,通过两个循环就可以获取到250部电影的所有信息。同时如果各位有何所指教也欢迎各位提出。(本章知识细节点并不详细,更多是为了实用性)

安装BeautifulSoup方法:

pip install beautilfulsoup4

创建对象:

from bs4 import BeautifulSoup 

模拟 浏览器访问,增加头部,使用request方法无法直接get获取到网页源代码,所以使用urllib

(本次爬取页面为豆瓣top250的第一页,循环后9页等没有添加)

from urllib.request import Request,urlopen

ua_header = {"User-Agent" : "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;"}
url = "https://movie.douban.com/top250?start=0&filter="
req_obj = Request(url,headers=ua_header)
title = urlopen(req_obj).read().decode("utf-8")

title则为获取下来的网页源代码。

 

 通过解析库可以发现lxml解析器是最适合最快速的。

soup = BeautifulSoup(title,'lxml')

解析器

使用方法

优势

劣势

Python标准库

BeautifulSoup(markup, "html.parser")

Python的内置标准库、执行速度适中、文档容错能力强

Python 2.7.3及Python 3.2.2之前的版本文档容错能力差

lxml HTML解析器

BeautifulSoup(markup, "lxml")

速度快、文档容错能力强

需要安装C语言库

lxml XML解析器

BeautifulSoup(markup, "xml")

速度快、唯一支持XML的解析器

需要安装C语言库

html5lib

BeautifulSoup(markup, "html5lib")

最好的容错性、以浏览器的方式解析文档、生成HTML5格式的文档

速度慢、不依赖外部扩展

 

类型:

print(type(soup))

print(type(movie))

 结果:

<class 'bs4.BeautifulSoup'>
<class 'bs4.element.Tag'>

 

网页源代码前一部分:

<!DOCTYPE html>
<html class="ua-windows ua-ie9" lang="zh-cmn-Hans">
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<meta content="webkit" name="renderer"/>
<meta content="always" name="referrer"/>
<meta content="ok0wCgT20tBBgo9_zat2iAcimtN4Ftf5ccsh092Xeyw" name="google-site-verification"/>
<title>
豆瓣电影 Top 250
</title>
......

运行 

#只会获取soup源码中第一个title标签的源码,
print(soup.title)
#与print(soup.find('title))效果相同

#只会获取soup源码中第一个title标签的源码的文本内容
print(soup.title.string)
#与print(soup.find('title).string)效果相同

结果 

<title>
豆瓣电影 Top 250
</title>

豆瓣电影 Top 250

 

而我们现在需要网页源代码中div的class为item的所有div。

所以:

#find只能获取第一个标签,若想获取多个标签或根据class进行获取则需要使用find_all
#获取soup中所有class为item的div
#因为数量过多目前只想取第一条数据,所以[0]
movie = soup.find_all('div',class_='item')[0]
#打印第一条class为item的div
print(movie)
<div class="item">
<div class="pic">
<em class="">1</em>
<a href="https://movie.douban.com/subject/1292052/">
<img alt="肖申克的救赎" class="" src="https://img3.doubanio.com/view/photo/s_ratio_poster/public/p480747492.jpg" width="100"/>
</a>
</div>
<div class="info">
<div class="hd">
<a class="" href="https://movie.douban.com/subject/1292052/">
<span class="title">肖申克的救赎</span>
<span class="title"> / The Shawshank Redemption</span>
<span class="other"> / 月黑高飞(港)  /  刺激1995(台)</span>
</a>
<span class="playable">[可播放]</span>
</div>
<div class="bd">
<p class="">
                            导演: 弗兰克·德拉邦特 Frank Darabont   主演: 蒂姆·罗宾斯 Tim Robbins /...<br/>
                            1994 / 美国 / 犯罪 剧情
                        </p>
<div class="star">
<span class="rating5-t"></span>
<span class="rating_num" property="v:average">9.7</span>
<span content="10.0" property="v:best"></span>
<span>1743954人评价</span>
</div>
<p class="quote">
<span class="inq">希望让人自由。</span>
</p>
</div>
</div>
</div>

 主要获取以下几条数据:top、电影名称、电影英文名称、电影封面截图地址、电影影评

#top:第一个em标签里的文本内容
top = movie.find('em').string
#电影中文名称:movie中第一个span标签的文本内容
name = movie.find('span').string
#电影外文名称:movie中第二个class为title的span标签的文本内容,字符串取第三个值到结尾
englishName = movie.find_all('span',class_='title')[1].string[2:]
#电影封面截图地址:movie中第一个img标签的src属性
imgSrc = movie.img['src']
#电影影评:movie中第一个class为ing的span标签,转换为字符串取第一个值到倒数第二个值
movieReviews = movie.find_all('span',class_='inq')[0].string[:-1]

 运行结果:

print("top:"+top+"  name:"+name+"  englishName:"+englishName+"  imgSrc:"+imgSrc+"  movieReviews:"+movieReviews)
top:1  name:肖申克的救赎  englishName: The Shawshank Redemption  imgSrc:https://img3.doubanio.com/view/photo/s_ratio_poster/public/p480747492.jpg  movieReviews:希望让人自由

 

 

源码(只获取并输出了豆瓣top250第一个电影的各种值):

from bs4 import BeautifulSoup
from urllib.request import Request,urlopen

# 头部
ua_header = {"User-Agent" : "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;"}
url = "https://movie.douban.com/top250?start=0&filter="
req_obj = Request(url,headers=ua_header)
title = urlopen(req_obj).read().decode("utf-8")
soup = BeautifulSoup(title,'lxml')
print(type(soup))
movie = soup.find_all('div',class_='item')[0]
print(type(movie))
top = movie.find('em').string
name = movie.find('span').string
englishName = movie.find_all('span',class_='title')[1].string[2:]
imgSrc = movie.img['src']
movieReviews = movie.find_all('span',class_='inq')[0].string[:-1]

print("top:"+top+"  name:"+name+"  englishName:"+englishName+"  imgSrc:"+imgSrc+"  movieReviews:"+movieReviews)

 

 

<clss....Tag>对象可使用str(...)转换成字符串

各位如果有相关问题也可以加我qq:1875319982

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值