python:网络爬虫之正则获取电影名称和封面

 

利用正则表达式查找电影名称和电影封面

示例代码显示如下:


import re
import ssl
import urllib.request
from bs4 import BeautifulSoup

url = "https://movie.douban.com/chart"
headers = {"user-agent":
               "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36"
           }
ssl._create_default_https_context = ssl._create_unverified_context
url_obj = urllib.request.Request(url, headers=headers)
response = urllib.request.urlopen(url_obj)
html = response.read().decode('utf8')
bs = BeautifulSoup(html, "html.parser")
data = bs.find_all("img", {"src": re.compile("https:\/\/(.+?)\.jpg")})
for i in data:
    print(i)
  • 使用用find_all()查找img标签且属性为src的数据

  • re.compile函数是编译正则表达式

  • \ 是转译符,把特殊含义的字符转成字面形式

  • () 是表达式编组,优先运行小括号的匹配

  • . 是任意匹配单个字符(包括符号、数字和空格等)

  • + 是匹配前面的字符,子表达式或者括号里的字符至少匹配一次

  • ? 是对它前面的正则式匹配0到1次重复。ab? 会匹配 'a' 或者 'ab'

正则表达式官方文档地址显示如下:

https://docs.python.org/zh-cn/3/library/re.html

运行后的结果显示如下:

鬼灭之刃 剧场版 无限列车篇
酒精计划
地球改变之年
小人物
无依之地
智能大反攻
扎克·施奈德版正义联盟
真人快打
新神榜:哪吒重生
徐福



但是只想要含有alt和src属性并且拿到alt和src属性的数据

示例代码显示如下:

data = bs.find_all("img", {"src": re.compile("https:\/\/(.+?)\.jpg")})
for i in data:
    print('电影名称:', i.attrs['alt'], ' || ', '电影图片:', i.attrs['src'])
  • i.attrs是获取全部属性

  • i.attrs['src'] 获取属性的值,和字典取值一样(因为i.attrs返回的就是一个字典对象)

 

运行后的显示结果如下:


Traceback (most recent call last):
  File "/Users/lifeng/python-projects/Test/pythonReptile/beautifulExample/run_beautiful_soup.py", line 29, in 
    print('电影名称:', i.attrs['alt'], ' || ', '电影封面:', i.attrs['src'])
KeyError: 'alt'
电影名称:鬼灭之刃 剧场版 无限列车篇  ||  电影封面:https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2623798236.jpg
电影名称:酒精计划  ||  电影封面:https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2628440526.jpg
电影名称:地球改变之年  ||  电影封面:https://img2.doubanio.com/view/photo/s_ratio_poster/public/p2638827823.jpg
电影名称:小人物  ||  电影封面:https://img2.doubanio.com/view/photo/s_ratio_poster/public/p2633966702.jpg
电影名称:无依之地  ||  电影封面:https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2630453887.jpg
电影名称:智能大反攻  ||  电影封面:https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2637896820.jpg
电影名称:扎克·施奈德版正义联盟  ||  电影封面:https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2634360594.jpg
电影名称:真人快打  ||  电影封面:https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2639148697.jpg
电影名称:新神榜:哪吒重生  ||  电影封面:https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2631711326.jpg
电影名称:徐福  ||  电影封面:https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2625736779.jpg

alt和src属性的数据是拿到了,但是又抛出了KeyError错误,主要是因为img标签中有一部分是没有alt属性的,在字典取值时没取到,就进行了抛错误

示例代码显示如下:


data = bs.find_all("img", {"src": re.compile("https:\/\/(.+?)\.jpg")})
for i in data:
    try:
        print('电影名称:', i.attrs['alt'], ' || ', '电影图片:', i.attrs['src'])
    except KeyError as e:
        pass

使用try...except进行异常捕获,抛keyError就pass掉

运行后的结果显示如下:

电影名称:鬼灭之刃 剧场版 无限列车篇  ||  电影封面:https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2623798236.jpg
电影名称:酒精计划  ||  电影封面:https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2628440526.jpg
电影名称:地球改变之年  ||  电影封面:https://img2.doubanio.com/view/photo/s_ratio_poster/public/p2638827823.jpg
电影名称:小人物  ||  电影封面:https://img2.doubanio.com/view/photo/s_ratio_poster/public/p2633966702.jpg
电影名称:无依之地  ||  电影封面:https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2630453887.jpg
电影名称:智能大反攻  ||  电影封面:https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2637896820.jpg
电影名称:扎克·施奈德版正义联盟  ||  电影封面:https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2634360594.jpg
电影名称:真人快打  ||  电影封面:https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2639148697.jpg
电影名称:新神榜:哪吒重生  ||  电影封面:https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2631711326.jpg
电影名称:徐福  ||  电影封面:https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2625736779.jpg

 

以上总结或许能帮助到你,或许帮助不到你,但还是希望能帮助到你,如有疑问、歧义,评论区留言会及时修正发布,谢谢!

未完,待续…

一直都在努力,希望您也是

 

微信搜索公众号:就用python

 

python:网络爬虫之正则获取电影名称和封面_第1张图片

 

 

 

 

 

你可能感兴趣的:(python网络爬虫,python,正则表达式,网络爬虫)