Python获取网页信息的四种方式
1. 标签法获取网页信息
首先,使用BeautifulSoup库对网页进行解析,接着获取网页信息
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)
2. find_all 和 find 函数获取网页信息
find_all 和 find 函数使用相同。 不同的是find函数返回匹配的第一个结果,结果以标签形式展现; find_all返回匹配的所以结果,结果以列表形式展现。下面以find_all函数为例进行说明:
# 运用 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)
3. css selector方法获取网页信息
select(‘路径’)查找方法为:打开网页——右击——检查——Elements——在Elements中找到所需内容(或在网页中找到所需内容,右击,选择“检查”, 在Elements中即可看到该内容)——右击——Copy——Copy Selector)
# 运用 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)
4. 正则表达式获取网页信息
# 获取网页信息
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. 在对正则表达式不熟悉的情况下,笔者建议对任何内容的获取均采用(.*?)的形式,方便记忆且不易出错。