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

73 阅读3分钟

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

前文回顾

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

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

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

书接上文

在上一篇的文章里,我们已经实现了根据html里的titles类获取对应的电影片名,但是随即而来的是另一个难题,那就是有一些像霸王别姬这类的电影,只有一个中文名字。而titles的返回的是一个或者两个电影名字,那这时候数据要怎么处理呢?

补充: 数据格式思路

在这个爬取的过程中,我们需要创建一个datalist的数组,用作存取整个网页的所有需要爬取的数据 image.png 如图,然后在每一个循环里,定义一个data的空数组,依次将爬取电影的中文片名,英文片名,图片链接,评价,简介,其他信息等数据append到data里面
然后data添加到datalist里面去。

titles 的处理

这里我的想法很简单,就是根据返回数组的长度去分别适配中文电影名和英文电影名 这里单独创建了一个etitles的数组用作存储英文名

    titles = re.findall(findtitles, item)
    length = len(titles)
    ctitle = titles[0]
    data.append(ctitle)
    if length > 1:
        etitles.append(titles[1])
        data.append(titles[1])
    else:
        etitles.append("无")
        data.append("无")

这时候再看看etitles输出:

 / The Shawshank Redemption
无
 / Forrest Gump
 / Titanic
 / Léon
 / La vita è bella
 / 千と千尋の神隠し
 ...

这时候可以发现,我们匹配到的字符串在输出上还存在着小问题。 在这个英文名的前面有一个可恶的斜杠,看着很突兀。
那么应该怎么去解决这个问题呢?

这时候就得使用python里的替换方法replace了:

data.append(others.replace("\xa0/\xa0", ""))

其他信息的正则表达式写法

抛转引玉,其他的正则表达式匹配如下

findlink = re.compile(r'href="(.*)"') # 电影链接
findimgSrc = re.compile(r'src="(.*)"\s') # 图片链接  
findtitles = re.compile(r'"title">(.*?)<') # 片名
findothers = re.compile(r'other">(.*)<') # 其他译名
findinq = re.compile(r"class=\"inq\">(.*?)<") # 一句话评价
findAvg = re.compile(r"v:average\">(.*)<") # 平均分
findrating = re.compile(r"span>(\d*)人评价<\/span>") # 打分

写到这里,相信你长出一口气,已经觉得这已经大功告成了吧。
但是新的问题又来了,出现了新的问题。 请见下文:

<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>

看到class='bd'的那一块了吗?那一块代表着电影的详细信息

它是长这样的:

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

Holy shit!! 这中间又有<br> 又有 &nbsp; 的 这怎么玩?
相信你看到这就骂娘了,直娘贼,作者你是不是又要吊我们的胃口,等到明天再更新怎么处理这种案例了?

对对对对对

下期预告

python正则表达式匹配html文档的收尾工作。

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

名片.jpg