爬虫之正则解析和 bs4 解析

正则解析(re模块)

单字符:

  • .:除换行以外所有字符
  • [ ]:[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次
    边界:
  • $:以某某结尾
  • ^:以某某开头
    分组:
  • (ab)
    贪婪模式:.*
    非贪婪(惰性)模式: .*?

使用方法

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)

爬虫之正则解析和 bs4 解析_第1张图片
re.S:单行匹配

# 匹配全部行
string = """细思极恐
你的队友在看书
你的敌人在磨刀
你的闺蜜在减肥
隔壁老王在练腰
""" re.findall('.*',string,re.S)

爬虫之正则解析和 bs4 解析_第2张图片
re.sub(正则表达式,替换内容,字符串)

示例

爬取糗事百科的图片

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('
.*?.*?</div',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 解析_第3张图片

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()

爬虫之正则解析和 bs4 解析_第4张图片
爬虫之正则解析和 bs4 解析_第5张图片

你可能感兴趣的:(爬虫)