Python获取网页信息的四种方式

Python获取网页信息的四种方式

  • 1. 标签法获取网页信息
    • 首先,使用BeautifulSoup库对网页进行解析,接着获取网页信息
  • 2. find_all 和 find 函数获取网页信息
    • find_all 和 find 函数使用相同。 不同的是find函数返回匹配的第一个结果,结果以标签形式展现; find_all返回匹配的所以结果,结果以列表形式展现。下面以find_all函数为例进行说明:
  • 3. css selector方法获取网页信息
    • select('路径')查找方法为:打开网页——右击——检查——Elements——在Elements中找到所需内容(或在网页中找到所需内容,右击,选择“检查”, 在Elements中即可看到该内容)——右击——Copy——Copy Selector)
  • 4. 正则表达式获取网页信息

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('(.*?).*?(.*?).*?

(.*?)

.*?(.*?)
.*?(.*?).*?(.*?)', 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. 在对正则表达式不熟悉的情况下,笔者建议对任何内容的获取均采用(.*?)的形式,方便记忆且不易出错。

你可能感兴趣的:(Python网络爬虫,Python)