1.今日内容大纲
一. 昨日内容回顾 1. re findall() 查找所有匹配的内容. list finditer() 返回迭代器 search() 查找. 找到一个就返回 . 如果找不到返回None match() 匹配. 从头匹配 sub() 根据正则替换 subn() 根据正则替换, 返回结果和替换的次数 split() 根据正则切割 compile() 编译正则. 分组 ()python中的分组. (?:)取消python的分组. (?P<名字>正则) 取值的关键 2. 模块 我们写的py文件就是一个模块. 1. import 模块 2. from 模块 import xxx 加载模块的过程: 1. 先去查看是否加载过该模块 顺序: 内存-> 内置 -> sys.path 2. 如果没有加载过. 开辟一个名称空间 3. 执行该模块中的代码, 所有产生的变量/类/函数都放在名称空间中 4. 给名称空间命名. 如果没有as 用模块名作为名字. 如果有as 用as后面的名字 import a, b, c 一次导入多个模块 from 模块 import a, b, c as xxx from xxx import * 二. 作业 三. 今日主要内容 1. from xxxx import * 从xxx导入所有. 如果模块内部有__all__ 导入all中的内容. 如果没有__all__全部都导入 2. 包 文件夹内包含了__init__.在导入包的时候, 默认执行__init__.py 查找的顺序: 内存 -> 内置 -> sys.path sys.path有坑: 根据你启动的脚本所在的位置确定查找包, 模块的路径 sys.path.insert(0, "你想加入的位置") 1. 绝对路径 从sys.path找. 根 2. 相对路径 相对于当前文件所在文件夹 . 当前 .. 上一层 启动脚本不能在包内 预习: 网络编程 ip tcp udp 考试: 基础+函数+模块+面向对象 包不考 大作业:
2.爬虫---爬取电影下载链接
import re
from urllib.request import urlopen
def getContent(url):
return urlopen(url).read().decode("gbk")
# # 爬取 http://www.dytt8.net/ 上的内容
url = "http://www.dytt8.net"
content = getContent(url)
# 准备正则
obj = re.compile(r"\[<a .*?>最新电影下载</a>\]<a href='(?P<second_url>.*?)'>.*?</a>", re.S)
second_obj = re.compile(r'<div id="Zoom">.*?译 名(?P<yiming>.*?)<br />◎片 名(?P<pianming>.*?)<br />.*?◎导 演(?P<daoyan>.*?)<br />◎主 演(?P<zhuyan>.*?)<br /><br />◎简 介.*?<td .*?><a href="(?P<download>.*?)">', re.S)
it = obj.finditer(content)
for el in it:
second_url = el.group("second_url")
second_content = getContent(url+second_url)
second_it = second_obj.finditer(second_content) # 拿到第二层通过正则匹配到的内容.
print("************************************************************************")
for second_info in second_it:
print(re.sub("[\u3000]", "", second_info.group("yiming")))
print(re.sub("[\u3000]", "", second_info.group("pianming")))
print(re.sub("[\u3000]", "", second_info.group("daoyan")))
print(re.split("<br />", re.sub("[\u3000]", "", second_info.group("zhuyan"))))
print(re.sub("[\u3000]", "", second_info.group("download")))
3.from xxx impo xxx
from liuwei import * # * 导入的是该模块下的所有名字, 如果模块中给出了__all__ 导入的是all列表中的名字
from liuwei import Person
print(money)
chi()
p = Person("小红", 18)
print(p)
import liuwei
from liuwei import chi
# import liuwei.chi # 错的
4.包
from urllib.request import urlopen # 点 前面的一定是包
# 包其实就是文件夹
from urllib import request
request.urlopen()
# 导入包要根据你的实际情况
# 包就是一个文件夹, 文件夹内部要有一个__init__.py
# 在py2中这个__init__.py是强制的. py3里面可以没有这个文件
# 自己定义一个包的话. 一定要给出__init__.py
# 创建包:
# 创建文件夹
# 创建__init__.py
# 使用pycharm可以直接创建python的package(包)
# import haha # 导入一个包的时候默认执行的是__init__.py文件
import os
os.makedirs('glance/api')
os.makedirs('glance/cmd')
os.makedirs('glance/db')
l = []
l.append(open('glance/__init__.py','w'))
l.append(open('glance/api/__init__.py','w'))
l.append(open('glance/api/policy.py','w'))
l.append(open('glance/api/versions.py','w'))
l.append(open('glance/cmd/__init__.py','w'))
l.append(open('glance/cmd/manage.py','w'))
l.append(open('glance/db/__init__.py','w'))
l.append(open('glance/db/models.py','w'))
map(lambda f:f.close() ,l)
import glance.api.policy
# glance.api.policy.get()
from glance.api.policy import get
def get():
print("我是get")
get()
import glance # 导入包的时候. 默认执行的是__init__.py
print(glance.money)
glance.hello()
from glance import *
print(money)
hello()
import glance
glance.api.policy.get()
# sys.path 是随动. 根据启动脚本所在的文件夹.
# 找glance里面的cmd 导入manage
# sys.path -> day026 包
# import glance.api.policy
import glance.api.versions
# 当你有一天写出来一个完整的框架级的功能. 很牛B的时候. 封装出来的包一般内部使用相对路径.
# 后面学习的高级框架.内部使用的大多数是相对路径.
# 你用别人写好的框架. 你要用绝对导入.
import glance
glance.api.policy.get()
5.其他补充
orange_hero.py
__all__ = ["money", "chi"] # 此时如果有人导入这个模块. 并且是from xxx import *
money = 5000
def chi():
print("刘伟喜欢吃东西")
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self): # 当执行print(对象)
return self.name + str(self.age)+"明天换套衣服"
run.py
if __name__ == '__main__':
xxxxmf.safmas.fmasfmas
fasdf
glance文件夹体系结构
api
__init__.py
policy.py
versions.py
cmd
__init__.py
manage.py
db
__init__.py
models.py
__init__.py