单字符:
.
:除换行以外所有字符[ ]
:[aoe] [a-w] 匹配集合中任意一个字符\d
:数字 [0-9 ]\D
:非数字\w
:数字、字母、下划线、中文\W
:非\w\s
:所有的空白字符包,括空格、制表符、换页符等等。等价于 【\f\n\r\t\v】。\S
:非空白*
:任意多次 >=0+
:至少一次 >=1?
:可有可无 0次或者1 次{m}
:苦丁 m 次 hello{3,}{m,}
:至少m次{m,n}
:m-n次$
:以某某结尾^
:以某某开头.*
.*?
re.I:忽略大小写
re.M:多行匹配
string = '''fall in love with you
i love you very much
i love she
i love her
'''
re.findall('^i.*',string,re.M)
# 匹配全部行
string = """细思极恐
你的队友在看书
你的敌人在磨刀
你的闺蜜在减肥
隔壁老王在练腰
爬取糗事百科的图片
import requests
import re
import urllib
import os
url = 'https://www.qiushibaike.com/pic/page/%d/?s=5216960'
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36'
}
# 创建存放图片文件夹
if not os.path.exists('./qiutu'):
os.mkdir('./qiutu')
start_page = int(input('enter a start pageNum:'))
end_page = int(input('enter a end pageNum:'))
for page in range(start_page,end_page+1):
new_url = format(url%page)
page_text = requests.get(url=new_url,headers=headers).text
img_url_list = re.findall('.*?',page_text,re.S)
for img_url in img_url_list:
img_url = "https:"+img_url
imgName = img_url.split('/')[-1]
imgPath = 'qiutu/'+imgName
urllib.request.urlretrieve(url=img_url,filename=imgPath)
print(imgPath,'下载成功!')
print("over!")
bs4解析
下载 bs4 和 lxml
pip install bs4
pip install lxml
解析原理
- 将即将要解析的源码加载到 bs 对象
- 调用 bs 对象中相关的方法或属性进行源码中的相关标签的定位
- 将定位到的标签之间存在的文本或者属性值获取
基础使用
使用流程:
- 导包 :from bs4 import BeautifulSoup
- 使用方法:可以将html转换为BeautifulSoup对象,通过属性的方法或者属性去查找指定的节点内容
(1) 转化本地文件:
- soup = BeautifulSoup(open(‘本地文件’),‘lxml’)
(2)转化网络文件;
- soup = BeautifulSoup(‘字符串类型或者字节类型’,‘lxml’)
(3)打印soup对象显示内容为html文件中的内容
基本的方法调用:
(1)根据标签名查找
- soup.a 只能找到第一个符合要求的标签
(2)获取属性
- soup.a.attrs 获取 a 所有的属性和属性值,返回一个字典
- soup.a.attrs[‘href’] 获取 href 属性
- soup.a[‘href’] 也可以简写为这种形式
(3)获取内容
- soup.a.string
- soup.a.text
- soup.a.get_text()
【注意】如果标签还有标签,string 返回None,其他两个返回文本
(4) find:找到第一个符合要求的标签
- soup.find(‘a’) 找到第一个符合要求的
- soup.find(‘a’,title=“xxx”)
- soup.find(‘a’,alt=“xx”)
- soup.find(‘a’,class=“xx”)
- soup.find(‘a’,id=“xxxx”)
(5) find_all:找到所有符合要求的标签
- soup.find_all(‘a’)
- soup.find_all([‘a’,‘b’]) 找到所有的 a 和 b标签
- soup.find_all(‘a’,limit=2) 限制前两个
(6)根据选择器选择的指定内容
select:soup.select(’#feng’)
- 常见选择器:标签选择器(a),类选择器(.)、id选择器(#)、层级选择器
示例
从古诗文网下载三国演义小说网址
import requests
from bs4 import BeautifulSoup
url = 'http://www.shicimingju.com/book/sanguoyanyi.html'
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36'
}
page_text = requests.get(url=url,headers=headers).text
soup = BeautifulSoup(page_text,'lxml')
a_list = soup.select('.book-mulu > ul > li > a')
fp = open('sanguo.txt','w',encoding='utf-8')
for a in a_list:
title = a.string
detail_url = 'http://www.shicimingju.com' + a['href']
detail_page_text = requests.get(url=detail_url,headers=headers).text
soup = BeautifulSoup(detail_page_text,'lxml')
content = soup.find('div',class_='chapter_content').text
fp.write(title+'\n'+content)
print(title,'下载完毕')
print('over')
fp.close()