加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

Python爬虫之解析网页!

发布时间:2020-12-17 00:29:53 所属栏目:Python 来源:网络整理
导读:常用的类库为lxml,BeautifulSoup,re(正则) 以获取豆瓣电影正在热映的电影名为例,url='https://movie.douban.com/cinema/nowplaying/beijing/' 网页分析 部分网页源码 分析可知我们要的电影名称信息在li标签的data-title属性里 下面开始写代码 爬虫源码展示 i

常用的类库为lxml,BeautifulSoup,re(正则)

以获取豆瓣电影正在热映的电影名为例,url='https://movie.douban.com/cinema/nowplaying/beijing/'

网页分析

部分网页源码

分析可知我们要的电影名称信息在li标签的data-title属性里

下面开始写代码

爬虫源码展示

import requests
from lxml import etree # 导入库
from bs4 import BeautifulSoup
import re
import time
# 定义爬虫类
class Spider():
 def __init__(self):
 self.url = 'https://movie.douban.com/cinema/nowplaying/beijing/'
 self.headers = {
 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/70.0.3538.77 Safari/537.36'
 }
 r = requests.get(self.url,headers=self.headers)
 r.encoding = r.apparent_encoding
 self.html = r.text
 def lxml_find(self):
 '''用lxml解析'''
 start = time.time() # 三种方式速度对比
 selector = etree.HTML(self.html) # 转换为lxml解析的对象
 titles = selector.xpath('//li[@class="list-item"]/@data-title') # 这里返回的是一个列表
 for each in titles:
 title = each.strip() # 去掉字符左右的空格
 print(title)
 end = time.time()
 print('lxml耗时',end-start)
 def BeautifulSoup_find(self):
 '''用BeautifulSoup解析'''
 start = time.time()
 soup = BeautifulSoup(self.html,'lxml') # 转换为BeautifulSoup的解析对象()里第二个参数为解析方式
 titles = soup.find_all('li',class_='list-item')
 for each in titles:
 title = each['data-title']
 print(title)
 end = time.time()
 print('BeautifulSoup耗时',end-start)
 def re_find(self):
 '''用re解析'''
 start = time.time()
 titles = re.findall('data-title="(.+)"',self.html)
 for each in titles:
 print(each)
 end = time.time()
 print('re耗时',end-start)
if __name__ == '__main__':
 spider = Spider()
 spider.lxml_find()
 spider.BeautifulSoup_find()
 spider.re_find()

输出结果

海王
无名之辈
无敌破坏王2:大闹互联网
狗十三
惊涛飓浪
毒液:致命守护者
憨豆特工3
神奇动物:格林德沃之罪
恐龙王
老爸102岁
生活万岁
进击的男孩
摘金奇缘
亡命救赎
一百年很长吗
云上日出
谁是坏孩子
照相师
缘·梦
网络谜踪
龙猫
印度合伙人
绿毛怪格林奇
最萌警探
春天的马拉松
lxml耗时 0.007623910903930664
海王
无名之辈
无敌破坏王2:大闹互联网
狗十三
惊涛飓浪
毒液:致命守护者
憨豆特工3
神奇动物:格林德沃之罪
恐龙王
老爸102岁
生活万岁
进击的男孩
摘金奇缘
亡命救赎
一百年很长吗
超时空大冒险
天渠
爱不可及
二十岁
你好,之华
冒牌搭档
铁甲战神
克隆人
恐怖快递
中国蓝盔
阿凡提之奇缘历险
名侦探柯南:零的执行人
为迈克尔·杰克逊铸造雕像
再见仍是朋友
心迷宫
淡蓝琥珀
阿拉姜色
两个俏公主
云上日出
谁是坏孩子
照相师
缘·梦
网络谜踪
龙猫
印度合伙人
绿毛怪格林奇
最萌警探
春天的马拉松
BeautifulSoup耗时 0.061043500900268555
海王
无名之辈
无敌破坏王2:大闹互联网
狗十三
惊涛飓浪
毒液:致命守护者
憨豆特工3
神奇动物:格林德沃之罪
恐龙王
老爸102岁
生活万岁
进击的男孩
摘金奇缘
亡命救赎
一百年很长吗
超时空大冒险
天渠
爱不可及
二十岁
你好,之华
冒牌搭档
铁甲战神
克隆人
恐怖快递
中国蓝盔
阿凡提之奇缘历险
名侦探柯南:零的执行人
为迈克尔·杰克逊铸造雕像
再见仍是朋友
心迷宫
淡蓝琥珀
阿拉姜色
两个俏公主
云上日出
谁是坏孩子
照相师
缘·梦
网络谜踪
龙猫
印度合伙人
绿毛怪格林奇
最萌警探
春天的马拉松
re耗时 0.0004856586456298828

代码说明

1. lxml

进群:960410445 即可获取源码哦!

lxml是通过xpath来查找

使用前需使用调用ertee.HTML()方法('()'内填HTML代码)生成一个可查找的对象

常用xpath语法如下

//两个斜杠为向下查找孙子标签

/一个斜杠为查找直接儿子标签

[]方括号内填标签属性,如查找class属性为name的a标签,格式为a[@class="name"]

/text()取出标签的内容,如查找网页中的 中的KAINHUCK,格式为?//a[@class="name"]/text()

/@attr取出标签的属性,如查找网页中的 中的class属性值name,格式为?//a[@class="name"]/@class

2. BeautifulSoup

使用前需先将HTML转换为课查找对象,格式为

BeautifulSoup(html,'lxml')

html 为HTML代码,后面的参数为转换方法(其他方法有?'html.parser'?,?'html5lib'?,推荐使用?'lxml'?)

查找方法

info =?find('a',id='kain')?查找第一个id属性为kain的a标签,并存进info变量中(其他标签同理)

find_all('a',class_='name')查找所有class属性为name的a标签(注:?class?属性需写成?'class_')

info.p.text获取第一个id属性为kain的a标签下的p标签的内容(info为上面例子里的info,其他同理)

info.p['name']获取第一个id属性为kain的a标签下的p标签的name属性值(info为上面例子里的info,其他同理)

当代码中有很多同级标签时

text1 text2 text3 text4

示例代码如下

from bs4 import BeautifulSoup
html = '''
 

text1 text2 text3 text4

''' soup = BeautifulSoup(html,'lxml') texts = soup.find('p',class_='info-list') print(texts.contents[1].text) # 输出text1 print(texts.contents[2].text) # 输出text2 print(texts.contents[3].text) # 输出text3 print(texts.contents[4].text) # 输出text4

注意:不是从0开始

3. re(正则表达式)

正则表达式内容较多,大家可以参考 这里

总结

使用lxml查找时可以在目标网页按F12调出开发者窗口然后再在按Ctrl+f查找,在查找栏里输入你的xpath语法可以检查是否能找到对应内容

可以从看例子的输出中看出三种方法的速度

lxml耗时 0.007623910903930664
BeautifulSoup耗时 0.061043500900268555
re耗时 0.0004856586456298828

对以上三种最常用的解析网页的方法做个对比

lxml BeautifulSoup re 语法难易度 简单 简单 复杂 查找速度 较快 慢 快 综上,对于网页内容的解析,这里推荐新手使用lxml方法,而对速度有要求就使用正则表达式(入门有点困难)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读