1.BeautfulSoup的补充
#2.kwargs 参数
t_list=bs.find_all(id='head')
t_list=bs.find_all(class_True)
for item in t_list:
print(item)
#3.text参数
t_list=bs.find_all(text='hao123')
t_list=bs.find_all('hao123','地图')
for item in t_list:
print(item) #输出 hao123 地图
#4.limit参数
t_list=bs.find_all('a',limit=3)
for item in t_list:
print(item)#输出又3个与字符串相关内容
#Css选择器
t_list=bs.select('title') #通过标签的查找
t_list=bs.select('.mnav') #通过类名查找
t_list=bs.select('#u1') #通过id来查找
for item in t_list:
print(item)
2.正则表达式的补充
操作符 说明 实例
. 表示任何单个字符
[ ] 字符集,对单个字符给出范围 [abc]表示a,b,c [A-Z]A-Z的单字符
* 前一个字符0或无限次扩展 abc* 表示ab abc abcc abcccc等
+ 前一个字符1或无限次扩展 abc+ 表示abc abc c abcccc等
? 前一个字符0或1次扩展 abc?表示ab abc
! 左右表达式任意一个 abc|def 表示abc def
{m} 扩展一个字符m次 ab{2}c 表示abcc
{m,n} 扩展一个字符m~n次 ab{1,2}表示 abc abcc
^ 匹配字符串开头 ^abc 表示abc在字符串的开头
$ 匹配字符串结尾 ^abc 表示abc在字符串的结尾
应用例子
import re
#创建模式对象
pat=re.compile('AA') #此处的AA是正则表达式用来验证的对象
m=pat.search('CBA') #被用来检验的对象
print(m) #输出为None
m=pat.search('AABBCCDD')
print(m) #输出span=(0,2)
m=pat.search('AABBCCAA')
print(m)
#最简单的方法
#没有模式的对象
m=re.search('mm','mmaacc')#前面的字符串是校验的规则 后面的字符串是校验对象
print(m)
print(re.findall('a','aSdacda')) #前面的字符串是校验的规则 后面的字符串是校验对象
#输出['a','a','a']
print(re.findall('[A-Z]+','ABCabcEFG'))
#输出 ['ABC','EFG']
#sub
print(re.sub('a','A','AAaaBBcc')) #在第三个字符串中的a用A来代替
#输出 AAAABBcc
3.正则提取以及标签解析
以豆瓣为例
from bs4 import BeautifulSoup #网页分析
import xlwt # 进行excel操作
import re # 正则表达式,进行文字匹配
import urllib.request,urllib.error # 进行数据获取
import sqlite3 #进行数字库操作
def main():
baseurl='https://movie.douban.com/top250?start='
#爬取网页
datalist=getData(baseurl)
savepath=r'.\\豆瓣电影Top250.xls'
#保存数据
# saveData(savepath)
askURL('https://movie.douban.com/top250?start=0')
#影片详情的规则
findLink=re.compile(r'<a href="(.*?)">') #创建正则表达式对象,确定规则
#影片图片
findImgSrc=re.compile(r'<img.*src="(.*?)"',re.S) #re.S 让换行符包含在字符中
#影片评分
findRating=re.compile(r'<span class="rating_num" property="v:average">(.*)</span>')
#影片片名
findTitle=re.compile(r'<span class="title">(.*)</span>')
#影片评价人数
findJudge=re.compile(r'<span>(\d*)人评价</span>')
#找到概况
findInq=re.compile(r'<span class="inq">(.*)</span>')
#找到影片相关内容
findBd=re.compile(r'<p class="">(.*?)</p>',re.S)
#爬取网页
def getData(baseurl):
datalist=[]
for i in range(0,10): #调用页面信息的函数:10次
url=baseurl+str(i*25)
html=askURL(url) #保存获取的源码
#逐一解析
soup=BeautifulSoup(html,"html.parser")
for item in soup.find_all('div',class_="item"):
#print(item) 测试查看item的全部信息
data=[] #保存一部电影的所有信息
item=str(item)
#影片详情
link=re.findall(findLink,item)[0] #re库用来通过正则表达式查找指定的字符串
data.append(link) #添加链接
imgsrc=re.findall(findImgSrc,item)[0]
data.append(imgsrc) #添加图片
titles=re.findall(findTitle,item)[0]
if (len(titles)==2):
ctitle=titles[0]
data.append(ctitle) #添加中文名
otitle=titles[1].replace('\n','') #去掉无关符号
data.append(otitle) #添加英文名
else:
data.append(titles[0])
data.append('') #外国名留空
judgeNum=re.findall(findJudge,item)[0]
data.append(judgeNum) #添加评价人数
inq=re.findall(findInq,item)[0]
if(len(inq)!=0):
inq=inq[0].replace('。','') #去掉句号
data.append(inq) #添加概述
else:
data.append('') #留空
bd=re.findall(findBd,item)[0]
bd=re.sub('<br(\s+)?>/(\s+)?','',bd) #去掉br
bd=re.sub('/','',bd) #替换斜杠为''
data.append(bd.strip()) #去掉前后的空格
datalist.append(data)
print(datalist)
return datalist
#得到指定的网页内容
def askURL(url):
head={ #模拟浏览器头部信息,
'User-Agent': 'Mozilla / 5.0(Windows NT 10.0; Win64;x64) AppleWebKit / 537.36(KHTML, like Gecko) Chrome / 98.0 .4758.102 Safari / 537.36 Edg / 98.0 .1108.62'
}
#用户代理,告诉豆瓣我们是什么类型的浏览器,
request=urllib.request.Request(url,headers=head)
html=""
try:
response=urllib.request.urlopen(request)
html=response.read().decode('utf-8')
# print(html)
except urllib.error.URLError as e:
if hasattr(e,'code'):
print(e.code)
if hasattr(e,'reason'):
print(e.reason)
return html
def saveData(savepath):
print('save......')
main()