利用正则表达式查找电影名称和电影封面
示例代码显示如下:
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
运行后的结果显示如下:
<img alt="鬼灭之刃 剧场版 无限列车篇" class="" src="https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2623798236.jpg" width="75"/>
<img alt="酒精计划" class="" src="https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2628440526.jpg" width="75"/>
<img alt="地球改变之年" class="" src="https://img2.doubanio.com/view/photo/s_ratio_poster/public/p2638827823.jpg" width="75"/>
<img alt="小人物" class="" src="https://img2.doubanio.com/view/photo/s_ratio_poster/public/p2633966702.jpg" width="75"/>
<img alt="无依之地" class="" src="https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2630453887.jpg" width="75"/>
<img alt="智能大反攻" class="" src="https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2637896820.jpg" width="75"/>
<img alt="扎克·施奈德版正义联盟" class="" src="https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2634360594.jpg" width="75"/>
<img alt="真人快打" class="" src="https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2639148697.jpg" width="75"/>
<img alt="新神榜:哪吒重生" class="" src="https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2631711326.jpg" width="75"/>
<img alt="徐福" class="" src="https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2625736779.jpg" width="75"/>
<img class="m_sub_img" src="https://img9.doubanio.com/view/photo/s_ratio_poster/public/p485887754.jpg"/>
<img class="m_sub_img" src="https://img2.doubanio.com/view/photo/s_ratio_poster/public/p1675053073.jpg"/>
<img class="m_sub_img" src="https://img1.doubanio.com/view/photo/s_ratio_poster/public/p1374786017.jpg"/>
<img class="m_sub_img" src="https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2249048907.jpg"/>
但是只想要含有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 <module>
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