Python爬⾍之解析⽹页
常⽤的类库为lxml, BeautifulSoup, re(正则)
⽹页分析
部分⽹页源码
<ul class="lists">
<li
id="3878007"
class="list-item"
data-title="海王"
data-score="8.2"
data-star="40"
data-release="2018"
data-duration="143分钟"
data-region="美国澳⼤利亚"
data-director="温⼦仁"
data-actors="杰森·莫玛 / 艾梅柏·希尔德 / 威廉·达福"
data-category="nowplaying"
data-enough="True"
data-showed="True"
data-votecount="105013"
data-subject="3878007"
>
分析可知我们要的电影名称信息在li标签的data-title属性⾥
下⾯开始写代码
爬⾍源码展⽰
import requests
from lxml import etree # 导⼊库
from bs4 import BeautifulSoup
import re
import time
# 定义爬⾍类
class Spider():
def __init__(self):
self.url = 'movie.douban/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 = (self.url,headers=self.headers)
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()
<_find()
输出结果
海王
⽆名之辈
⽆敌破坏王2:⼤闹互联⽹
狗⼗三
惊涛飓浪
毒液:致命守护者
憨⾖特⼯3
神奇动物:格林德沃之罪
恐龙王
⽼爸102岁
⽣活万岁
进击的男孩
摘⾦奇缘
亡命救赎
⼀百年很长吗
云上⽇出
谁是坏孩⼦
照相师
缘·梦
⽹络谜踪
龙猫
印度合伙⼈
绿⽑怪格林奇
最萌警探
春天的马拉松
lxml耗时 0.007623910903930664
海王
⽆名之辈
⽆敌破坏王2:⼤闹互联⽹
狗⼗三
惊涛飓浪
毒液:致命守护者
憨⾖特⼯3
神奇动物:格林德沃之罪
恐龙王
⽼爸102岁
⽣活万岁
进击的男孩
摘⾦奇缘
亡命救赎
⼀百年很长吗
超时空⼤冒险
天渠
爱不可及
⼆⼗岁
你好,之华
冒牌搭档
铁甲战神
克隆⼈
恐怖快递
中国蓝盔
阿凡提之奇缘历险
名侦探柯南:零的执⾏⼈
为迈克尔·杰克逊铸造雕像
再见仍是朋友
⼼迷宫
淡蓝琥珀
阿拉姜⾊
两个俏公主
云上⽇出
谁是坏孩⼦
照相师
缘·梦
⽹络谜踪
龙猫
印度合伙⼈
绿⽑怪格林奇
最萌警探
春天的马拉松
BeautifulSoup耗时 0.061043500900268555海王
⽆名之辈
⽆敌破坏王2:⼤闹互联⽹
狗⼗三
惊涛飓浪
毒液:致命守护者
憨⾖特⼯3
神奇动物:格林德沃之罪
恐龙王
⽼爸102岁
⽣活万岁
进击的男孩
摘⾦奇缘
亡命救赎
⼀百年很长吗
超时空⼤冒险
天渠
爱不可及
⼆⼗岁
你好,之华
冒牌搭档
铁甲战神
克隆⼈python新手代码你好
恐怖快递
中国蓝盔
阿凡提之奇缘历险
名侦探柯南:零的执⾏⼈
为迈克尔·杰克逊铸造雕像
再见仍是朋友
⼼迷宫
淡蓝琥珀
阿拉姜⾊
两个俏公主
云上⽇出
谁是坏孩⼦
照相师
缘·梦
⽹络谜踪
龙猫
印度合伙⼈
绿⽑怪格林奇
最萌警探
春天的马拉松
re耗时 0.0004856586456298828
代码说明
1. lxml
lxml是通过xpath来查
使⽤前需使⽤调⽤ertee.HTML()⽅法('()'内填HTML代码)⽣成⼀个可查的对象
常⽤xpath语法如下
// 两个斜杠为向下查孙⼦标签
/ ⼀个斜杠为查直接⼉⼦标签
[] ⽅括号内填标签属性,如查class属性为name的a标签,格式为a[@class="name"]
/text() 取出标签的内容,如查⽹页中的 <a class="name">KAINHUCK</a> 中的KAINHUCK,格式为//a[@class="name"]/text()
/@attr 取出标签的属性,如查⽹页中的 <a class="name">KAINHUCK</a> 中的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_')
获取第⼀个id属性为kain的a标签下的p标签的内容(info为上⾯例⼦⾥的info,其他同理)
info.p['name'] 获取第⼀个id属性为kain的a标签下的p标签的name属性值(info为上⾯例⼦⾥的info,其他同理)
当代码中有很多同级标签时
<p class='info-list'>
<a class='name'>text1</a>
<a class='name'>text2</a>
<a class='name'>text3</a>
<a class='name'>text4</a>
</p>
⽰例代码如下
from bs4 import BeautifulSoup
html = '''
<p class='info-list'>
<a class='name'>text1</a>
<a class='name'>text2</a>
<a class='name'>text3</a>
<a class='name'>text4</a>
</p>
'''
soup = BeautifulSoup(html, 'lxml')
texts = soup.find('p', class_='info-list')
ts[1].text) # 输出text1
ts[2].text) # 输出text2
ts[3].text) # 输出text3
ts[4].text) # 输出text4
注意:不是从0开始
3. re(正则表达式)
正则表达式内容较多,⼤家可以参考
总结
使⽤lxml查时可以在⽬标⽹页按F12调出开发者窗⼝然后再在按Ctrl+f查,在查栏⾥输⼊你的xpath语法可以检查是否能到对应内容可以从看例⼦的输出中看出三种⽅法的速度
lxml耗时 0.007623910903930664
BeautifulSoup耗时 0.061043500900268555
re耗时 0.0004856586456298828
对以上三种最常⽤的解析⽹页的⽅法做个对⽐
lxml BeautifulSoup re
语法难易度简单简单复杂
查速度较快慢快
综上,对于⽹页内容的解析,这⾥推荐新⼿使⽤lxml⽅法,⽽对速度有要求就使⽤正则表达式(⼊门有点困难)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论