正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。
比如说现在有一串很长的字符串
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()
运行结果图