BeautifulSoup用法全网最细总结—爬取豆瓣TOP250

BeautifulSoup用法详解

一、前言:HTML语法简介

HTML:Hyper Text Markup Language:超文本标记语言是我们编写网页的最基本也是最核心的一种语法,语法规则就是用不同的标签对网页上的内容进行标记从而使网页显示出不同的展示效果,网页包括文字、按钮、图片、视频等各种复杂的元素,图片用img标签表示,视频用viedio标签表示,段落用p标签表示,它们之间的布局又长通过 div嵌套组合而成,各种标签通过不同的排列和嵌套形成了网页的框架

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>我的联通</title>
</head>
<body>
    <h1>1级标题</h1>
    <h2>2级标题</h2>
    <h3>3级标题</h3>
    <h4>4级标题</h4>
    <h5>5级标题</h5>
    <h6>6级标题</h6>
</body>
</html>

DOCTYPE定义了文档类型,其次最外层是 html 标签,其内部是 head 签和 body 标签,分别代表网页头和网页体,head 标签内定义了一些页面的配置和引用,如<meta charset="UTF-8">指定了网页的编码为 UTF-8
一个网页的标准形式是 html 签内嵌套 headbody 标签, head 内定义网页的配置和引用, body 内定义网页的正文

  • title 标签则定义了网页的标题,会显示在网页的选项卡中,不会显示在正文中
  • body 标签内则是在网页正文中显示的内容
  • h1标签代表一个一级标题

p标签:文本段落标签【块级标签】

不同的p标签之间会默认进行换行表示不同段落,文章、评论等信息都可以用p标签表示,如果你直接在文本段落标签中换行,网页显示的时候,换行并不会起作用,只会多一个空格,如果需要换行,可以用多个p标签或者用br标签在文本段落中强制换行【br标签就是换行标签,只有起始标签,没有配对的闭合标签】

img标签:图片标签【和br标签一样没有闭合标签】需要指定一个属性src表示图片的路径(src的值可以是一个指向图片的链接,也可以是一个路径)

img标签除了必须有的src属性,还有一些其他属性可以指定,比如width属性和height属性可以用于设置图像宽度和高度

<img src="图片地址" />			<!--图片标签-->

a标签:用来添加链接,方便用户通过链接在不同网页之间跳转

<a href="http://www.baidu.com">周杰伦</a>

在起始和闭合标签之间放上链接对应的文字,用户点击该文字就是可以跳转到对应的地址,这个标签有一个必须指定的属性即href,它的值就是要跳转的URL地址,它还有一个非必要的属性target用来指定链接页面的打开方式,target的值默认为_self表示直接在当前窗口跳转链接,指定为_blank表示在新窗口里打开

div标签span标签:容器标签,本身不包含任何内容,一般我们会让其他标签被这两个标签包围作为div元素或span元素的子元素

div是块级元素,独占一块,一行最多放一个div元素
span是内联元素不会独占一块,一行可以有多个span元素

当我们想给多个元素加上红色背景时,就可以把CSS样式直接运用在某个容器上

  • 第一个div 标签定义了网页中的区块,它的 id 是container ,这是一个非常常用的属性,且 id 的内容在网页中是唯一的,我们可以通过它来定位并获取这个区块
  • 第二个div 标签,它的 classwrapper,这个属性经常与经常与 CSS 配合使用来设定样式

ol标签和ul标签:列表标签【ol:order listul:unorder list

<!--无序列表-->
<ul>
    <li>中国移动</li>
    <li>中国联通</li>
    <li>中国电信</li>
</ul>

<!--有序列表-->
<ol>
    <li>中国移动</li>
    <li>中国联通</li>
    <li>中国电信</li>
</ol>

table标签:表格标签
关于其他的HTML标签这里不做过多介绍,感兴趣的同学可以自行了解

属性
class属性可以被应用在所有元素上,定义元素的类的名称,class属性可以帮助我们分组

若一个网页上有多个文本段落,我们可以通过class="content"class="review"来区分开哪些文本段落是文章,哪些文本段落是用户评论

<p class="content">给岁月以文明</p>
<p class="content">而不是给文明以岁月</p>
<p class="review">五星好评</p>

一般我们可以借助于属性可以实现精准定位某个标签结点

在浏览器中点击右键,然后显示网页源代码,或者直接按F12

二、Beautiful Soup 简介

学习网页解析需要同学们对前端基础知识有一定的理解,不然学起来就很吃力,因为知识没有连接性,并不是这个知识点有多难

数据解析的原理

网页数据解析的原理

  1. 标签定位
  2. 提取标签、标签属性中存取的数据值

bs4数据解析的原理

  1. 实例化一个 Beautiful Soup对象,并将页面源码数据加载到该对象中
  2. 通过调用 Beautiful Soup对象中相关的属性或者方法进行标签定位和数据提取

环境安装

pip install lxml
pip install bs4

对象的实例化

  1. 将本地的html文档中的数据加载到对象中
  2. 将互联网上获取到的页面源码加载到该对象中

方法介绍

方法选择器

find()
返回第一个匹配的元素

find_all()
<class 'bs4.BeautifulSoup'>对象有个find_all() 的方法,能根据标签、属性等找出所有符合要求的元素,返回的是所有匹配的元素组成的列表,我们可以通过for循环依次操作返回的各个对象

节点选择器

import requests
from bs4 import BeautifulSoup

html = requests.get('https://www.baidu.com/')
soup = BeautifulSoup(html.content, 'lxml')

print(type(soup))           # <class 'bs4.BeautifulSoup'>:表示整个文档
print(type(soup.title))     # <class 'bs4.element.Tag'>
print(soup.title)       # 标签及其内容(拿到它所找到的第一个内容)
print(soup.title.string)    # 只有标签里的内容(字符串)
print(type(soup.title.string))      # <class 'bs4.element.NavigableString'>

response.text 返回的数据类型是 unicoded 的文本数据
response.content 返回的数据类型是 bytes 的二进制数据
如果爬取的数据是文本就用 response.text
如果爬取的数据是图片文件就可以用 response.content

html传入BeautifulSoup的构造函数里,因为BeautifulSoup除了解析HTML之外,还可以解析一些其他类型的内容,所以还需要有第二个参数去指定解析器,解析HTML可以传入html.parser,调用BeautifulSoup函数后,我们会获得一个实例对象<class 'bs4.BeautifulSoup'>BeautifulSoup把看起来复杂的HTML内容解析成下面这样的树状结构,让搜索和修改HTML结构变得更为容易
在这里插入图片描述
<class 'bs4.BeautifulSoup'>对象有自己的方法和属性可以帮助我们获取想要的信息,现在我们将这个对象赋值为soup

  • soup.p就可以获取到这个HTML里的第一个<p>元素,如果<p>里面还有其他标签的话,soup.p会把第一个p标签连带里面所有内容都一并返回

当有多个节点时,这种选择方式只会选择到第一个匹配的节点,其他的后面的节点都会忽略

  • soup.img返回这个HTML里的第一个img元素即图片元素
获取标签之间的文本数据

soup.a.text/soup.get_text(): 获取某一个标签中所有的文本内容
soup.a.string:只可以获取该标签下面直系的文本内容

获取标签中的属性值

定位到某个节点后,该节点可能有多个属性,比如 idclass 等,选择这个节点元素后,可以调用 attrs获取所有属性,attrs 的返回结果是字典形式,它把选择的节点的所有属性和属性值组合成一个字典

前面只做简单的介绍,使用方法与技巧我们在接下来的案例中来看

三、实战案例一:从网页源码获取豆瓣电影TOP250

分析想提取的信息的特点,所有的标题都是一个span元素,并且它们的class值都是title,所以我们就可以根据这个条件去提取这个信息
在这里插入图片描述
step1:实例化BeautifulSoup对象,传入获取到的网页源码,并指定解析器为lxml

soup = BeautifulSoup(html, 'lxml')	# html为获取到的网页源码(字符串)

step2:每部电影的信息被保存在ol标签节点下面的li节点中,所以我们首先需要定位到ol标签节点
在这里插入图片描述

movie_items = soup.find_all(name='ol', attrs={'class': 'grid_view'})
>>> type(movie_items)	  # <class 'bs4.element.ResultSet'>
>>> type(movie_items[0])	  # <class 'bs4.element.Tag'>

调用 find_all()方法,根据节点名name和属性名attrs查询所有满足条件的节点,返回的结果是类似于列表类型的结果集对象,长度为 1,每个元素依然都是bs4.element.Tag 类型

step3:遍历movie_items节点下面的每个li标签节点【保存电影信息的节点】,提取节点中包含的电影排名、评价人数、电影名称等等信息
因为movie_items[0]Tag 类型,所以依然可以进行嵌套查询

movie_info = movie_items[0].find_all(name='li')
>>>len(movie_info)    # 25
>>>type(movie_info[0])  # <class 'bs4.element.Tag'>

这里的movie_info是包含所有li标签的结果集,这里我们以第一个li节点(即top1:肖申克的救赎)中的源码信息进行分析从而提取到我们想要的信息

<li>
 <div class="item">
  <div class="pic">
   <em class="">
    1
   </em>
   <a href="https://movie.douban.com/subject/1292052/">
    <img alt="肖申克的救赎" class="" src="https://img2.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>
      2930905人评价
     </span>
    </div>
    <p class="quote">
     <span class="inq">
      希望让人自由。
     </span>
    </p>
   </div>
  </div>
 </div>
</li>

  • 获取电影排名信息【直接调用节点的名称em就可以选择节点元素,再调用 string 属性就可以得到节点内的文本】
rank = movie_info[0].em.string
  • 获取电影海报信息【电影海报即一张图片链接,存储在a标签下面的img标签的属性src中,故这里可以使用嵌套选择,.a返回结果都是bs4.element.Tag 类型,故可以继续使用.a.img进行下一步的选择,接着.a.img.attrs['src']获取属性对应的属性值】
# movie_info[0].a.img.attrs   {'width': '100', 'alt': '肖申克的救赎', 'src': 'https://img2.doubanio.com/view/photo/s_ratio_poster/public/p480747492.jpg', 'class': []}
picture = movie_info[0].a.img.attrs['src']
# picture = movie_info[0].a.img['src']      # 简洁写法
  • 获取电影名称、电影简介、电影评分信息【相较于find_all()方法,find方法返回的是单个元素 ,也就是第一个匹配的元素,函数入参(即筛选条件)基本一致】
movie_name = movie_info[0].find(name='span', attrs={'class': 'title'}).string

# 存在个别电影没有简介,故这里加了一个分支条件,没有简介的电影赋值为一个空字符串
movie_introduction = '' if not movie_info[0].find(name='span', attrs={'class': 'inq'}) else movie.find(name='span', attrs={'class': 'inq'}).string

movie_rating = movie_info[0].find(name='span', attrs={'class': 'rating_num'}).string
  • 获取电影评价人数信息【评价人数只包含在span标签中,没有多余的属性条件可用于筛选,这个定位有那么一丢丢复杂】评价人数处于class=stardiv块级标签中并与电影评分属于同级标签(即兄弟节点),问题转换为在可以获取电影评分的信息的前提下,如何获取它的兄弟节点评价人数信息
movie_rating = movie_info[0].find(name='span', attrs={'class': 'rating_num'})
next_sibling_node = movie_rating.next_siblings		# 返回后面所有兄弟节点的生成器
evaluators = list(next_sibling_node)[3].string
  • 获取电影详情信息【电影详情信息在第一个a标签节点的href属性中,所以我们要先定位到该节点,重新请求并获取响应,解析该电影详情页面中关于电影详情的介绍,这个我们直接封装一个函数来完成】
def get_movie_detail(url, headers):
    response = requests.get(url=url, headers=headers)
    if response.status_code == 200:
        html = response.text
        soup = BeautifulSoup(html, 'lxml')
        detail_intro = soup.find(name='span', attrs={'property': 'v:summary', 'class': ''})
        return detail_intro.get_text().strip().replace('\n', '').replace(' ', '').replace(u'\u3000', '')
    return None

你还可以接着获取详情页中的电影评论,这里我们不做演示,至此,我们对一部电影信息的提取做了详细分析,接下来,就将所有电影信息的提取交给我们循环就好了,上源码

爬取豆瓣电影top250-python源码

import requests
from bs4 import BeautifulSoup


def get_one_page(url, header):
    response = requests.get(url, headers=header)
    if response.status_code == 200:
        return response.text

    return None


def get_movie_detail(url, headers):
    response = requests.get(url=url, headers=headers)
    if response.status_code == 200:
        html = response.text
        soup = BeautifulSoup(html, 'lxml')
        detail_intro = soup.find(name='span', attrs={'property': 'v:summary', 'class': ''})
        return detail_intro.get_text().strip().replace('\n', '').replace(' ', '').replace(u'\u3000', '')
    return None


def parse_one_page(html):
    soup = BeautifulSoup(html, 'lxml')
    page_items = soup.find_all(name='ol', attrs={'class': 'grid_view'})

    for movie_items in page_items:
        movie_info = movie_items.find_all(name='li')

        for movie in movie_info:
            rank = movie.em.string  # 电影排名信息
            picture = movie.a.img.attrs['src']  # 电影海报信息
            movie_name = movie.find(name='span', attrs={'class': 'title'}).string  # 电影名称信息

            # 存在个别电影没有简介,故这里加了一个分支条件,没有简介的电影赋值为一个空字符串
            movie_introduction = '' if not movie.find(name='span', attrs={'class': 'inq'}) else movie.find(
                name='span', attrs={'class': 'inq'}).string  # 电影简介信息

            movie_rating = movie.find(name='span', attrs={'class': 'rating_num'}).string  # 电影评分信息

            # 电影评价人数信息
            next_sibling_node = movie.find(name='span', attrs={'class': 'rating_num'}).next_siblings  # 返回后面所有兄弟节点的生成器
            evaluators = list(next_sibling_node)[3].string

            # 电影详情信息介绍(电影详情信息在另一个url中)
            detail_url = movie.a.attrs['href']
            detail_info = get_movie_detail(detail_url, headers)

            yield {
                '电影排名': rank,
                '电影名称': movie_name,
                '电影简介': movie_introduction,
                '电影海报': picture,
                '电影评分': movie_rating,
                '评价人数': evaluators,
                '电影详情': detail_info
            }


if __name__ == '__main__':
    headers = {  # 伪造请求头,模拟浏览器发起请求
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36',
    }
    for i in range(10):
        offset = i * 25  # 0, 25, 50, 75,...225
        url = f"https://movie.douban.com/top250?start={offset}"
        html = get_one_page(url, headers)
        for item in parse_one_page(html):
            print(item)

代码运行结果部分演示

{'电影排名': '1', '电影名称': '肖申克的救赎', '电影简介': '希望让人自由。', '电影海报': 'https://img2.doubanio.com/view/photo/s_ratio_poster/public/p480747492.jpg', '电影评分': '9.7', '评价人数': '2930981人评价', '电影详情': '一场谋杀案使银行家安迪(蒂姆•罗宾斯TimRobbins饰)蒙冤入狱,谋杀妻子及其情人的指控将囚禁他终生。在肖申克监狱的首次现身就让监狱“大哥”瑞德(摩根•弗里曼MorganFreeman饰)对他另眼相看。瑞德帮助他搞到一把石锤和一幅女明星海报,两人渐成患难之交。很快,安迪在监狱里大显其才,担当监狱图书管理员,并利用自己的金融知识帮助监狱官避税,引起了典狱长的注意,被招致麾下帮助典狱长洗黑钱。偶然一次,他得知一名新入狱的小偷能够作证帮他洗脱谋杀罪。燃起一丝希望的安迪找到了典狱长,希望他能帮自己翻案。阴险伪善的狱长假装答应安迪,背后却派人杀死小偷,让他唯一能合法出狱的希望泯灭。沮丧的安迪并没有绝望,在一个电闪雷鸣的风雨夜,一场暗藏几十年的越狱计划让他自我救赎,重获自由!老朋友瑞德在他的鼓舞和帮助下,也勇敢地奔向自由。本片获得1995年奥...'}
{'电影排名': '2', '电影名称': '霸王别姬', '电影简介': '风华绝代。', '电影海报': 'https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2561716440.jpg', '电影评分': '9.6', '评价人数': '2164355人评价', '电影详情': '段小楼(张丰毅)与程蝶衣(张国荣)是一对打小一起长大的师兄弟,两人一个演生,一个饰旦,一向配合天衣无缝,尤其一出《霸王别姬》,更是誉满京城,为此,两人约定合演一辈子《霸王别姬》。但两人对戏剧与人生关系的理解有本质不同,段小楼深知戏非人生,程蝶衣则是人戏不分。段小楼在认为该成家立业之时迎娶了名妓菊仙(巩俐),致使程蝶衣认定菊仙是可耻的第三者,使段小楼做了叛徒,自此,三人围绕一出《霸王别姬》生出的爱恨情仇战开始随着时代风云的变迁不断升级,终酿成悲剧。'}
{'电影排名': '3', '电影名称': '阿甘正传', '电影简介': '一部美国近现代史。', '电影海报': 'https://img2.doubanio.com/view/photo/s_ratio_poster/public/p2372307693.jpg', '电影评分': '9.5', '评价人数': '2184998人评价', '电影详情': '阿甘(汤姆·汉克斯饰)于二战结束后不久出生在美国南方阿拉巴马州一个闭塞的小镇,他先天弱智,智商只有75,然而他的妈妈是一个性格坚强的女性,她常常鼓励阿甘“傻人有傻福”,要他自强不息。阿甘像普通孩子一样上学,并且认识了一生的朋友和至爱珍妮(罗宾·莱特·潘饰),在珍妮和妈妈的爱护下,阿甘凭着上帝赐予的“飞毛腿”开始了一生不停的奔跑。阿甘成为橄榄球巨星、越战英雄、乒乓球外交使者、亿万富翁,但是,他始终忘不了珍妮,几次匆匆的相聚和离别,更是加深了阿甘的思念。有一天,阿甘收到珍妮的信,他们终于又要见面……'}
{'电影排名': '4', '电影名称': '泰坦尼克号', '电影简介': '失去的才是永恒的。 ', '电影海报': 'https://img2.doubanio.com/view/photo/s_ratio_poster/public/p2896604953.jpg', '电影评分': '9.5', '评价人数': '2217942人评价', '电影详情': '1912年4月10日,号称“世界工业史上的奇迹”的豪华客轮泰坦尼克号开始了自己的处女航,从英国的南安普顿出发驶往美国纽约。富家少女罗丝(凯特•温丝莱特)与母亲及未婚夫卡尔坐上了头等舱;另一边,放荡不羁的少年画家杰克(莱昂纳多·迪卡普里奥)也在码头的一场赌博中赢得了下等舱的船票。罗丝厌倦了上流社会虚伪的生活,不愿嫁给卡尔,打算投海自尽,被杰克救起。很快,美丽活泼的罗丝与英俊开朗的杰克相爱,杰克带罗丝参加下等舱的舞会、为她画像,二人的感情逐渐升温。1912年4月14日,星期天晚上,一个风平浪静的夜晚。泰坦尼克号撞上了冰山,“永不沉没的”泰坦尼克号面临沉船的命运,罗丝和杰克刚萌芽的爱情也将经历生死的考验。'}
{'电影排名': '5', '电影名称': '这个杀手不太冷', '电影简介': '怪蜀黍和小萝莉不得不说的故事。', '电影海报': 'https://img2.doubanio.com/view/photo/s_ratio_poster/public/p511118051.jpg', '电影评分': '9.4', '评价人数': '2317532人评价', '电影详情': '里昂(让·雷诺饰)是名孤独的职业杀手,受人雇佣。一天,邻居家小姑娘马蒂尔达(纳塔丽·波特曼饰)敲开他的房门,要求在他那里暂避杀身之祸。原来邻居家的主人是警方缉毒组的眼线,只因贪污了一小包毒品而遭恶警(加里·奥德曼饰)杀害全家的惩罚。马蒂尔达得到里昂的留救,幸免于难,并留在里昂那里。里昂教小女孩使枪,她教里昂法文,两人关系日趋亲密,相处融洽。女孩想着去报仇,反倒被抓,里昂及时赶到,将女孩救回。混杂着哀怨情仇的正邪之战渐次升级,更大的冲突在所难免……'}
{'电影排名': '6', '电影名称': '千与千寻', '电影简介': '最好的宫崎骏,最好的久石让。 ', '电影海报': 'https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2557573348.jpg', '电影评分': '9.4', '评价人数': '2268631人评价', '电影详情': '千寻和爸爸妈妈一同驱车前往新家,在郊外的小路上不慎进入了神秘的隧道——他们去到了另外一个诡异世界—一个中世纪的小镇。远处飘来食物的香味,爸爸妈妈大快朵颐,孰料之后变成了猪!这时小镇上渐渐来了许多样子古怪、半透明的人。千寻仓皇逃出,一个叫小白的人救了他,喂了她阻止身体消失的药,并且告诉她怎样去找锅炉爷爷以及汤婆婆,而且必须获得一份工作才能不被魔法变成别的东西。千寻在小白的帮助下幸运地获得了一份在浴池打杂的工作。渐渐她不再被那些怪模怪样的人吓倒,并从小玲那儿知道了小白是凶恶的汤婆婆的弟子。一次,千寻发现小白被一群白色飞舞的纸人打伤,为了救受伤的小白,她用河神送给她的药丸驱出了小白身体内的封印以及守封印的小妖精,但小白还是没有醒过来。为了救小白,千寻又踏上了她的冒险之旅。'}
{'电影排名': '7', '电影名称': '美丽人生', '电影简介': '最美的谎言。', '电影海报': 'https://img2.doubanio.com/view/photo/s_ratio_poster/public/p2578474613.jpg', '电影评分': '9.6', '评价人数': '1340189人评价', '电影详情': '犹太青年圭多(罗伯托·贝尼尼)邂逅美丽的女教师多拉(尼可莱塔·布拉斯基),他彬彬有礼的向多拉鞠躬:“早安!公主!”。历经诸多令人啼笑皆非的周折后,天遂人愿,两人幸福美满的生活在一起。然而好景不长,法西斯政权下,圭多和儿子被强行送往犹太人集中营。多拉虽没有犹太血统,毅然同行,与丈夫儿子分开关押在一个集中营里。聪明乐天的圭多哄骗儿子这只是一场游戏,奖品就是一辆大坦克,儿子快乐、天真的生活在纳粹的阴霾之中。尽管集中营的生活艰苦寂寞,圭多仍然带给他人很多快乐,他还趁机在纳粹的广播里问候妻子:“早安!公主!”法西斯政权即将倾覆,纳粹的集中营很快就要接受最后的清理,圭多编给儿子的游戏该怎么结束?他们一家能否平安的度过这黑暗的年代呢?'}
{'电影排名': '8', '电影名称': '星际穿越', '电影简介': '爱是一种力量,让我们超越时空感知它的存在。', '电影海报': 'https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2614988097.jpg', '电影评分': '9.4', '评价人数': '1871830人评价', '电影详情': '近未来的地球黄沙遍野,小麦、秋葵等基础农作物相继因枯萎病灭绝,人类不再像从前那样仰望星空,放纵想象力和灵感的迸发,而是每日在沙尘暴的肆虐下倒数着所剩不多的光景。在家务农的前NASA宇航员库珀(马修·麦康纳MatthewMcConaughey饰)接连在女儿墨菲(麦肯吉·弗依MackenzieFoy饰)的书房发现奇怪的重力场现象,随即得知在某个未知区域内前NASA成员仍秘密进行一个拯救人类的计划。多年以前土星附近出现神秘虫洞,NASA借机将数名宇航员派遣到遥远的星系寻找适合居住的星球。在布兰德教授(迈克尔·凯恩MichaelCaine饰)的劝说下,库珀忍痛告别了女儿,和其他三名专家教授女儿艾米莉亚·布兰德(安妮·海瑟薇AnneHathaway饰)、罗米利(大卫·吉雅西DavidGyasi饰)、多伊尔(韦斯·本特利WesB...'}
{'电影排名': '9', '电影名称': '辛德勒的名单', '电影简介': '拯救一个人,就是拯救整个世界。', '电影海报': 'https://img2.doubanio.com/view/photo/s_ratio_poster/public/p492406163.jpg', '电影评分': '9.6', '评价人数': '1118064人评价', '电影详情': '1939年,波兰在纳粹德国的统治下,党卫军对犹太人进行了隔离统治。德国商人奥斯卡·辛德勒(连姆·尼森LiamNeeson饰)来到德军统治下的克拉科夫,开设了一间搪瓷厂,生产军需用品。凭着出众的社交能力和大量的金钱,辛德勒和德军建立了良好的关系,他的工厂雇用犹太人工作,大发战争财。1943年,克拉科夫的犹太人遭到了惨绝人寰的大屠杀,辛德勒目睹这一切,受到了极大的震撼,他贿赂军官,让自己的工厂成为集中营的附属劳役营,在那些疯狂屠杀的日子里,他的工厂也成为了犹太人的避难所。1944年,德国战败前夕,屠杀犹太人的行动越发疯狂,辛德勒向德军军官开出了1200人的名单,倾家荡产买下了这些犹太人的生命。在那些暗无天日的岁月里,拯救一个人,就是拯救全世界。'}
{'电影排名': '10', '电影名称': '盗梦空间', '电影简介': '诺兰给了我们一场无法盗取的梦。', '电影海报': 'https://img9.doubanio.com/view/photo/s_ratio_poster/public/p513344864.jpg', '电影评分': '9.4', '评价人数': '2089127人评价', '电影详情': '道姆·柯布(莱昂纳多·迪卡普里奥LeonardoDiCaprio饰)与同事阿瑟(约瑟夫·戈登-莱维特JosephGordon-Levitt饰)和纳什(卢卡斯·哈斯LukasHaas饰)在一次针对日本能源大亨齐藤(渡边谦饰)的盗梦行动中失败,反被齐藤利用。齐藤威逼利诱因遭通缉而流亡海外的柯布帮他拆分他竞争对手的公司,采取极端措施在其唯一继承人罗伯特·费希尔(希里安·墨菲CillianMurphy饰)的深层潜意识中种下放弃家族公司、自立门户的想法。为了重返美国,柯布偷偷求助于岳父迈尔斯(迈克尔·凯恩MichaelCaine饰),吸收了年轻的梦境设计师艾里阿德妮(艾伦·佩吉EllenPage饰)、梦境演员艾姆斯(汤姆·哈迪TomHardy饰)和药剂师约瑟夫(迪利普·劳DileepRao饰)加入行动。在一层层...'}
...

注:大家在复制粘贴运行代码之前记得换一下自己机器的User-Agent

结语

本文给大家介绍了BeatifulSoup 在网页源码解析中的应用,这里需要多提一句的是,如果网站的网页源码有变动的话,文章中最后的实战代码可能无法正确解析网页源码,甚至直接抛出错误,但是网页解析的原理是不变的,等你真正学会并熟悉了Beautiful解析库的使用之后,你可以直接查看网页源代码去匹配筛选你真正想要的信息,博主这篇文章的目的旨在带领大家入门解析库,了解它的作用,而不是像技术手册一样枯燥乏味的给你介绍每个函数的入参出参,每个函数的功能,最后,如果你觉得本文对你有用的话,还请大家不吝点赞哦~

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

code_lover_forever

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

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

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

打赏作者

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

抵扣说明:

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

余额充值