赞
踩
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.162 Safari/537.36'
}
# 访问网页
r = requests.get('http://maoyan.com/board/4',headers = headers)
# 读取网页内容
r = r.text
# 将网页内容解析为BeautifulSoup能读懂的方式
soup = BeautifulSoup(r, 'html.parser')
# 打印网页内容 print(soup.prettify()) # 获取‘p’标签的信息 print(soup.p) # 查看’p‘标签的类型 print(type(soup.p)) # 获取’p’标签的名字 print(soup.p.name) # 获取‘p'标签的属性 print(soup.p.attrs) # 获取’P‘标签的内容 print(soup.p.string) # 获取’P‘标签的内容的类型 print(type(soup.p.string)) # 获取’P‘标签属性的值 print(soup.p['class']) print(soup.p.get('class')) # 更改‘p’标签的属性值 soup.p['class'] = 'newclass' # 查看更改后的’p‘属性 print(soup.p['class']) # 查看soup的类型 print(type(soup)) # 查看soup的名字 print(soup.name) # 删除’p‘的class del soup.p['class'] # 查看删除属性后的’p‘ print(soup.p) # 查看’script‘标签内容 print(soup.script.string) # 查看’script‘标签内容的类型 print(type(soup.script.string))
# 查找 dd 标签 print(soup.dd) # 查看 dd 标签的类型 print(type(soup.dd)) # 查找 dd 标签的儿子 print(soup.dd.children) # 打印 dd 的儿子 # enumerate多用于在for循环中得到计数,利用它可以同时获得索引和值, # 即需要index和value值的时候可以使用enumerate for i, child in enumerate(soup.dd.children): print(i, child) # 查找 dd 标签的所有后代 print(soup.dd.descendants) # 打印 dd 标签的后代 for i, child in enumerate(soup.dd.descendants): print(i, child) # 查找 dd 标签的父母 print(soup.dd.parent) # 查找 dd 标签的祖先 print(soup.dd.parents) # 打印 dl 标签的祖先 for i, parent in enumerate(soup.dd.parents): print(i, parent) # 查找 dd 标签下面的所有兄弟 print(soup.dd.next_siblings) # 查找 dd 标签前面的所有兄弟 print(soup.dd.previous_siblings) # 查找 dd 标签下面的一个兄弟 print(soup.dd.next_sibling) # 查找 dd 标签前面的一个兄弟 print(soup.dd.previous_sibling)
# 运用 find_all 查找所有属性为 data-act="boarditem-click" 的标签, 返回列表形式 print(soup.find_all(attrs = {'data-act':"boarditem-click"})) # 打印所有属性为 data-act="boarditem-click" 的标签的内容 for i in soup.find_all(attrs = {'data-act':"boarditem-click"}): print('名称',i.string) # 运用 find_all 查找所有标签名为 ‘p’ 的标签, 返回列表形式 print(soup.find_all('p')) # 运用find_all 查找文本 ‘霸王别姬’ print(soup.find_all(text = re.compile('霸王别姬'))) # 运用 find_all 查找所有属性为 class = 'name' 的标签, 返回列表形式 print(soup.find_all(class_ = 'name')) # 打印所有属性为 class = 'name' 的标签的内容 for i in soup.find_all(class_ = 'name'): print('名称',i.string)
# 运用 css selector 方法查找 ‘霸王别姬’ 这个电影的标题 title = soup.select('#app > div > div > div.main > dl > dd:nth-of-type(1) > div > div > div.movie-item-info > p.name > a') # 打印标题 print(title) # 运用 css selector 方法查找所有电影的标题, 返回列表形式 titles = soup.select('#app > div > div > div.main > dl > dd > div > div > div.movie-item-info > p.name > a') # 查找所有电影的排名, 返回列表形式 orders = soup.select('#app > div > div > div.main > dl > dd > i') # 查找所有电影的主演, 返回列表形式 actors = soup.select('#app > div > div > div.main > dl > dd > div > div > div.movie-item-info > p.star') # 查找所有电影的上映时间, 返回列表形式 times = soup.select('#app > div > div > div.main > dl > dd > div > div > div.movie-item-info > p.releasetime') # 查找所有电影的海报, 返回列表形式 images = soup.select('#app > div > div > div.main > dl > dd > a > img.board-img') # 打印所有电影的 排名 海报 标题 主演 上映时间 for order, image, title, actor, time in zip(orders, images, titles, actors, times): info = {'排名':order.string, '海报':image.get('data-src'),# get函数提取标签内的属性 '电影名':title.string, '主演':actor.get_text().strip(), '上映时间':time.string} print(info)
# 获取网页信息 def parse_one_page(html): # 将正则表达式转换为正则对象, 可复用编译 # ()内的内容为我们所要获取的内容 pattern = re.compile('<li.*?class="">(.*?)</em.*?src="(.*?)".*?</a>.*?<span class="title">(.*?)</span>.*?<p class="">(.*?)</p>.*?<span.*? property="v:average">(.*?)</span>.*?<span>(.*?)</span>.*?<span class="inq">(.*?)</span.*?</li>', re.S) # 获取匹配后的结果, 返回列表形式 contents = re.findall(pattern, html) # 对列表进行循环变量,其中content是元组形式 for content in contents: data = {} data['排名'] = content[0] data['海报'] = content[1] data['电影'] = content[2] data['导演'] = content[3].strip() # 将两边的空格删去 data['得分'] = content[4] data['评价人数'] = content[5] data['语句'] = content[6] yield data # 返回对象
注:1.(.?)为非贪婪匹配,可以匹配任何内容;(.)为贪婪匹配,也可以匹配任何内容。
2. 在对正则表达式不熟悉的情况下,笔者建议对任何内容的获取均采用(.*?)的形式,方便记忆且不易出错。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。