一名前端工作人员的python爬虫实践记录【3】--用正则表达式匹配html文档【上】

1,004 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第4天,点击查看活动详情

前文回顾

一名前端工作人员的python爬虫实践记录【1】——通过urllib封装请求

一名前端工作人员的python爬虫实践记录【2】---BeautifulSoup

书接上文

上一篇文章了,我们已经成功对浏览器封装了请求,认识了BeautifulSoup
但是问题也来了:

在数据渲染中,只要我们定位到class='item' 我们便可以获取到具体的电影信息,那为了配合BeautifulSoup的使用,咱们得使用一种常见的方法去匹配对应的代码段,那就是怎样的方法,能够在这茫茫多的代码之中,如狡兔一般迅捷,如猎鹰一般精准地锁定目标,成功匹配呢?

没错,这就是我们今天的主角,正则表达式。

正则表达式

什么是正则表达式?

正则表达式是用于匹配字符串中字符组合的模式。在编程开发里,正则表达式常常用作匹配特定规则的字符串,例如电话号码,身份证号码,特定规则下的id等等。

我该怎么练习正则表达式呢?

  • 多练习 俗话说的好,熟能生巧,无论是巧手还是俗手,都离不开平时本手的积累。 这里是两个很不错的练习正则表达式的网站
    这个支持在线文本检测
    这个支持多语言切换

  • 如果平时很少有练习的机会的话,可以尝试把常用的正则表达式规则打印下来,贴在键盘垫上,随用随查!

图片源自网络

那怎么将正则表达式和Beautiful Soup结合呢?

还是以豆瓣电影top250为例:

由此可见,每部电影都是在一个class='item'li标签里渲染的。

<li>
            <div class="item">
                <div class="pic">
                    <em class="">1</em>
                    <a href="https://movie.douban.com/subject/1292052/">
                        <img width="100" alt="肖申克的救赎" src="https://img2.doubanio.com/view/photo/s_ratio_poster/public/p480747492.jpg" class="">
                    </a>
                </div>
                <div class="info">
                    <div class="hd">
                        <a href="https://movie.douban.com/subject/1292052/" class="">
                            <span class="title">肖申克的救赎</span>
                                    <span class="title">&nbsp;/&nbsp;The Shawshank Redemption</span>
                                <span class="other">&nbsp;/&nbsp;月黑高飞(港)  /  刺激1995(台)</span>
                        </a>


                            <span class="playable">[可播放]</span>
                    </div>
                    <div class="bd">
                        <p class="">
                            导演: 弗兰克·德拉邦特 Frank Darabont&nbsp;&nbsp;&nbsp;主演: 蒂姆·罗宾斯 Tim Robbins /...<br>
                            1994&nbsp;/&nbsp;美国&nbsp;/&nbsp;犯罪 剧情
                        </p>

                        
                        <div class="star">
                                <span class="rating5-t"></span>
                                <span class="rating_num" property="v:average">9.7</span>
                                <span property="v:best" content="10.0"></span>
                                <span>2664126人评价</span>
                        </div>

                            <p class="quote">
                                <span class="inq">希望让人自由。</span>
                            </p>
                    </div>
                </div>
            </div>
        </li>

示例

以获取第一名的肖申克的救赎的片名为例:

image.png

第一步:创建正则表达式匹配式: 由观察可知,片名信息是在class:'title'下:

<span class="title">肖申克的救赎</span>
                                    <span class="title">&nbsp;/&nbsp;The Shawshank Redemption</span>

因此创建正则表达式:

findtitles = re.compile(r'"title">(.*?)<')

第二步:循环
由于我们的html里,一页就有25个item,因此我们需要一个循环,这里要用到BeautifulSoup里面的find_all方法

for item in bs.find_all("div", attrs={"class": "item"}):

第三步:在item里面查找片名
通过正则里面的findall 获取片名titles

    titles = re.findall(findtitles, item)

还有问题...?

titles的输出如下:

肖申克的救赎
 / The Shawshank Redemption

由此可见,在html里面 中文名和英文名都是在title下,而有的电影,如霸王别姬,是没有英文名的,那怎么办呢?
容我暂时卖个关子,下期为您娓娓道来。

下期预告

  • 片名匹配的细化处理
  • 其他信息的匹配处理
  • 爬取数据后的格式处理问题

我是短袖撸码蒂尔尼
一名热爱阿森纳的前端工程师
如果本文对您有帮助,可以给一个免费的赞吗?谢谢!

名片.jpg