Python爬虫之解析网页!

Python爬虫之解析网页!,第1张

概述常用的类库为lxml,BeautifulSoup,re(正则)以获取豆瓣电影正在热映的电影名为例,url=\'https://movie.douban.com/cinema/nowplaying/beijing/\'

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

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

网页分析

部分网页源码

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

下面开始写代码

爬虫源码展示

import requestsfrom lxml import etree # 导入库from bs4 import BeautifulSoupimport reimport 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[@]/@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[@]

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

/@attr取出标签的属性,如查找网页中的 中的class属性值name,格式为 //a[@]/@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 BeautifulSoupHTML = ''' 

text1 text2 text3 text4

'''soup = BeautifulSoup(HTML,'lxml')texts = soup.find('p',class_='info-List')print(texts.contents[1].text) # 输出text1print(texts.contents[2].text) # 输出text2print(texts.contents[3].text) # 输出text3print(texts.contents[4].text) # 输出text4

注意:不是从0开始

3. re(正则表达式)

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

总结

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

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

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

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

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

总结

以上是内存溢出为你收集整理的Python爬虫之解析网页!全部内容,希望文章能够帮你解决Python爬虫之解析网页!所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/langs/1208437.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存