爬虫(四)正则表达式

正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。
比如说现在有一串很长的字符串

fdfdbgerth165hasdfasddsasdadDSVADFASDAdfsffsdfsdfsd123dasfdfsgfgdsfgg

我们想要这个串里的数字而不是字母
这个时候使用正则表达式再适合不过了
具体操作看下面:

import re
string = 'fdfdbgerth165hasdfasddsasdadDSVADFASDAdfsffsdfsdfsd123dasfdfsgfgdsfgg'
lis = re.findall('\d+',string)#\d+ 匹配字符串中的数字部分,返回列表
print(lis)

输出为:在这里插入图片描述
可以看到我们的数字都已经被提取出来并存进了数组当中
具体可看:http://www.runoob.com/regexp/regexp-syntax.html
对于豆瓣电影的其他信息
在这里插入图片描述
观察到其实很多信息不完整,所以我并不打算把所有信息都挨个儿提取出来

我提取的只有 电影名称、导演、年份
关于电影的点评,其实也是可以提取到的,但是我在写这个代码的时候,没有想到一些电影是没有点评的,后面改也会很费劲,所以就没有去改动了。
这告诉我,写后续代码前一定一定要把前面得到的 数据输出来观察一下,看看有没有异常值、缺失值。我就栽在这里好几个小时。
代码如下:

import re
import requests
from bs4 import BeautifulSoup

count = 1

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


def URL_list():#构建URL列表
    urls = []
    for i in range(0,250,25):
        url = 'https://movie.douban.com/top250?start=' + str(i) + '&filter='
        urls.append(url)
    return urls

def get_data(url):
    res = requests.get(url,headers = headers)
    #soup = BeautifulSoup(res.text,'lxml')
    return res.text

def parse_data(text,data):
    global count
    soup = BeautifulSoup(text,'lxml')
    film_names = soup.select('#content > div > div.article > ol > li > div > div.info > div.hd > a > span:nth-of-type(1)')        
    film_data = soup.select('#content > div > div.article > ol > li > div > div.info > div.bd > p:nth-of-type(1)')
    #print(film_data)
    
    for (i,j) in zip(film_data,film_names):
        target = i.get_text()
        director_name = re.search('导演: .*',target).group()[4:-1]#匹配导演
        year = re.search('[0-9]{4}',target).group()#匹配年份
        film_name = j.get_text()
        lis = [film_name,director_name.split()[0],year]
        data[count] = lis
        count += 1
        #lis = [film_name,director_name,actor_name,year,country,features]

def print_data(data):
    for i in range(1,251):
        print(data[i])

def main():
    urls = URL_list()
    data = {}
    for url in urls:
        text = get_data(url)
        parse_data(text,data)
    print_data(data)


main()

运行结果图
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值