• day12
  • 知识补充
  • json模块
  • 第三方模块
  • requests模块
  • xml

知识补充

1、python内部为我们也提供很多全局变量
2、在 .py 文件里面;使用 vars() 可以查看python为当前 .py 文件提供的所有的全局变量
3、创建一个空的 .py 文件;使用 vars();查看全局变量
主要的:
1、 __doc__:.py 文件的注释

扩展:
文件的注释;在一个文档的开头用三个引号 “”” “”“;在里面的内容就表示是此文档的注释

2、__file__:当前文档的路径
3、__package__:引入当前文件的模块所在文件夹,用 . 划分;当前文件为 None
4、__cached__:缓存, .py文件的缓存是 .pyc 文件(在py3.0里有,2.7里面没有);当前没有为None;引入的文件才有
5、__name__

  • 执行某个 ,py 文件的时候;它的 __name__ 就是 __main__
  • 在执行文件中输出其他的文件的 __name__ 等于它们的文件名

我们经常h会看到别人的代码中有这样段代码

1.if __name__ == "__main__":
2.    pass

分析:
我们在执行文件中输入print(__name__)打印的结果是 __main__;如果此时打印引入文件的 __name__:结果确是它的文件名;在主文件中加上这个判断;如果此文件再被调用的时候是不会执行的;这样防止文件被别人调用。

那什么时候用,怎样用?
主文件:调用主函数前,必须加这个判断

1.if __name__ == "__main__":
2.    # 执行主函数

6、__loader__:加载
7、__spec__:加载(功能比loader少)
8、__builtins__:放着内置函数的模块
上面讲的我们必须掌握的:
1、主文件;判断代码
2、__file__配合os模块和sys模块

  • os.path.join 和 os.path.dirname

3、内置函数在 __builtins__里面

小知识:
我们浏览网页;从服务器请求数据。服务器返回的永远都是字符串

json模块

1、json.loads():用于将列表、字典形式的字符串转换成相应的列表、字典;存储在内存

1.import json
2.li = "[11,22,33,44]"
3.ret1 = json.loads(li)
4.print(ret1)  # [11, 22, 33, 44]
5.
6.#### 转换字典
7.dic1 = '{"name":"haha", "age":18}'
8.ret2 = json.loads(dic1)
9.print(ret2) # {'name': 'haha', 'age': 18}
10.
11.#### 改变字典单双引号
12.dic2 = "{'name':'haha', 'age':18}"
13.ret3 = json.loads(dic2)
14.print(ret3) # 报错

分析上面报错的原因:
python内置模块json在处理列表、元组、字典类型的字符串的时候;如果内部的元素是字符串;必须使用双引号包起来;不然就会报错!

试试列表:(一样出错)

1.li = "['haha', 'heihei']"
2.ret = json.loads(li)
3.print(ret) # 报错

2、json.dumps():将列表、元组、字典;转换为字符串形式的列表、字典;存储在内存

1.li = ['haha', 'heihei']
2.ret = json.dumps(li)
3.print(ret, type(ret)) # ["haha", "heihei"] <class 'str'>

3、json.load(file):将指定文件中的列表、字典字符串转换为列表、字典;存于内存(一般不用)

  • file:要被转换内容的文件

4、json.dump(obj, file):把列表,元组,字典转换成字符串列表、字典;然后再存入指定的文件(一般不用)

  • obj:接收改变的对象
  • file:转换完后要存入的文件

上面的功能特列(元组):
我们用loads()转换元组,会报错!

1.li = '("haha", "heihei")'
2.ret = json.loads(li)
3.print(ret) # 报错

那是不是说明没办法转换元组那?
既然我们从字符串转化不回元组;那将元组转化成字符串?

1.li = ("haha", "heihei")
2.ret = json.dumps(li)
3.print(ret) # ["haha", "heihei"]

能成功;但是却是个列表类型的字符串;为什么那?

说明:
括号里面含元素;是python独有的;json是提供语言与语言之间关系的;那么python独有的则在其他语言肯定是不行的;所有元组的转换会被转化成列表。所以要转换成元组,要先转化成列表再从列表转化成元组(元组是特殊的列表嘛!)

第三方模块

不是python自带的;是官方之外的人写的
1、模块安装方式

  • 软件管理工具pip3
  • 源码安装(直接下载源码)

2、安装三方模块
软件管理工具安装:

  • 在控制台(cmd)中输入:pip3 install requests
  • 回车;电脑会自动下载,安装

说明:
如果没有pip3的要自己安装;并且要将pip3所在的文件位置加入环境变量中去才行。

源码安装:

  • 首先下载
  • 然后解压;并找到解压后文件中的setup.py文件的位置
  • 在终端进入setup.py所在的文件位置
  • 在终端输入 python setup.py install
  • 然后回车;即可自动安装成功

requests模块

用于发送http请求(用python模拟浏览器浏览网页)
1、requests.get(“url”):给指定url地址发送

1.http请求
2.import requests
3.
4.response = requests.get("http://www.baidu.com")
5.print(response) # <Response [200]>

2、获取返回的内容:.text

1.import requests
2.
3.response = requests.get("http://www.baidu.com")
4.print(response.text)

返回的是html页面代码组成的字符串
3、对获取的内容解码:

1.import requests
2.
3.response = requests.get("http://www.baidu.com")
4.response.encoding = "utf-8"

上面的例子记住完整的顺序:

1.import requests
2.
3.response = requests.get("http://www.baidu.com")
4.response.encoding = "utf-8"
5.print(response.text)

分析:
上面的例子;返回的是 百度 首页的html代码组成的字符串

xml

引入模块:

1.from xml.etree import ElementTree

XML是实现不同语言或程序之间进行数据交换的协议,XML文件格式如下:

1.<data>
2.    <country name="Liechtenstein">
3.        <rank updated="yes">2</rank>
4.        <year>2023</year>
5.        <gdppc>141100</gdppc>
6.        <neighbor direction="E" name="Austria" />
7.        <neighbor direction="W" name="Switzerland" />
8.    </country>
9.    <country name="Singapore">
10.        <rank updated="yes">5</rank>
11.        <year>2026</year>
12.        <gdppc>59900</gdppc>
13.        <neighbor direction="N" name="Malaysia" />
14.    </country>
15.    <country name="Panama">
16.        <rank updated="yes">69</rank>
17.        <year>2026</year>
18.        <gdppc>13600</gdppc>
19.        <neighbor direction="W" name="Costa Rica" />
20.        <neighbor direction="E" name="Colombia" />
21.    </country>
22.</data>

第一种解析xml:

1.# 引入XML模块并重新命名为ET
2.from xml.etree import ElementTree as ET
3.# xml获取通过open打开test.xml文件并将里面的内容读取出来的内容
4.f = ET.XML(open("test.xml", "r", encoding="utf-8").read())
5.# 获取文件的根节点的名称
6.n1 = f.tag
7.print(n1) # 结果为data
8.# 遍历获取的对象
9.for i in f:
10.    # 打印data的节点
11.    print(i)
12.    print(i.tag)# 打印节点的标签名
13.    print(i.attrib) #打印当前节点属性
14.    # 接下来获取想获取 i 的子节点
15.    # 可以使用 for去遍历
16.    # 这里也可以用 find
17.    # 使用find获取子节点;然后用text获取子节点内容
18.    print(i.find("year").text)

分析:
上面的方法是通过open打开文档获取字符串解析xml文档;我们可以通过对应的方法获取相应的值

另一种解析方式
和上面的只是解析方式不一样;在遍历的时候都是直接遍历整个文档内容

1.from xml.etree import ElementTree as ET
2.
3.############ 解析方式一 ############
4."""
5.# 打开文件,读取XML内容
6.str_xml = open('xo.xml', 'r').read()
7.
8.# 将字符串解析成xml特殊对象,root代指xml文件的根节点
9.root = ET.XML(str_xml)
10."""
11.############ 解析方式二 ############
12.
13.# 直接解析xml文件
14.tree = ET.parse("xo.xml")
15.
16.# 获取xml文件的根节点
17.root = tree.getroot()
18.
19.### 操作
20.
21.# 顶层标签
22.print(root.tag)
23.
24.# 遍历XML文档的第二层
25.for child in root:
26.    # 第二层节点的标签名称和标签属性
27.    print(child.tag, child.attrib)
28.    # 遍历XML文档的第三层
29.    for i in child:
30.        # 第二层节点的标签名称和内容
31.        print(i.tag,i.text)

再一种解析方式
和第一种比较不但解析方式不一样;在遍历的时候也是不一样的;它直接遍历文档中指定的子节点;同时也能对文档进行修改

1.from xml.etree import ElementTree as ET
2.
3.############ 解析方式一 ############
4."""
5.# 打开文件,读取XML内容
6.str_xml = open('xo.xml', 'r').read()
7.
8.# 将字符串解析成xml特殊对象,root代指xml文件的根节点
9.root = ET.XML(str_xml)
10."""
11.############ 解析方式二 ############
12.
13.# 直接解析xml文件
14.tree = ET.parse("xo.xml")
15.
16.# 获取xml文件的根节点
17.root = tree.getroot()
18.
19.### 操作
20.
21.# 顶层标签
22.print(root.tag)
23.
24.# 遍历XML中所有的year节点
25.for node in root.iter('year'):
26.    # 节点的标签名称和内容
27.    print(node.tag, node.text)

注意:
上面的操作都是在内存中进行的;即使修改也只是保存在内存中;如果想要永久保存;必须将要保存的文档通过(write())重新写入文档中才行。


实例:在python中结合腾讯端口检测qq时候在线

1.import requests
2.from xml.etree import ElementTree as ET
3.
4.# 使用内置模块urllib发送HTTP请求,或者XML格式内容
5."""
6.f = urllib.request.urlopen('http://www.webxml.com.cn//webservices/qqOnlineWebService.asmx/qqCheckOnline?qqCode=424662508')
7.result = f.read().decode('utf-8')
8."""
9.
10.
11.# 使用第三方模块requests发送HTTP请求,或者XML格式内容
12.r = requests.get('http://www.webxml.com.cn//webservices/qqOnlineWebService.asmx/qqCheckOnline?qqCode=424662508')
13.result = r.text
14.
15.# 解析XML格式内容
16.node = ET.XML(result)
17.
18.# 获取内容
19.if node.text == "Y":
20.    print("在线")
21.else:
22.    print("离线")

实例:查看火车停靠信息

1.import requests
2.from xml.etree import ElementTree as ET
3.
4.# 使用内置模块urllib发送HTTP请求,或者XML格式内容
5."""
6.f = urllib.request.urlopen('http://www.webxml.com.cn/WebServices/TrainTimeWebService.asmx/getDetailInfoByTrainCode?TrainCode=G666&UserID=')
7.result = f.read().decode('utf-8')
8."""
9.
10.# 使用第三方模块requests发送HTTP请求,或者XML格式内容
11.r = requests.get('http://www.webxml.com.cn/WebServices/TrainTimeWebService.asmx/getDetailInfoByTrainCode?TrainCode=G666&UserID=')
12.result = r.text
13.
14.# 解析XML格式内容
15.root = ET.XML(result)
16.for node in root.iter('TrainDetailInfo'):
17.    print(node.find('TrainStation').text,node.find('StartTime').text,node.tag,node.attrib)

创建xml文件:
第一种方式

1.from xml.etree import ElementTree as ET
2.
3.# 创建根节点
4.root = ET.Element("famliy")
5.
6.# 创建节点大儿子
7.son1 = ET.Element('son', {'name': '儿1'})
8.# 创建小儿子
9.son2 = ET.Element('son', {"name": '儿2'})
10.
11.# 在大儿子中创建两个孙子
12.grandson1 = ET.Element('grandson', {'name': '儿11'})
13.grandson2 = ET.Element('grandson', {'name': '儿12'})
14.son1.append(grandson1)
15.son1.append(grandson2)
16.
17.# 把儿子添加到根节点中
18.root.append(son1)
19.root.append(son1)
20.
21.tree = ET.ElementTree(root)
22.tree.write('oooo.xml',encoding='utf-8', short_empty_elements=False)

第二种:

1.from xml.etree import ElementTree as ET
2.
3.# 创建根节点
4.root = ET.Element("famliy")
5.
6.# 创建大儿子
7.# son1 = ET.Element('son', {'name': '儿1'})
8.son1 = root.makeelement('son', {'name': '儿1'})
9.# 创建小儿子
10.# son2 = ET.Element('son', {"name": '儿2'})
11.son2 = root.makeelement('son', {"name": '儿2'})
12.
13.# 在大儿子中创建两个孙子
14.# grandson1 = ET.Element('grandson', {'name': '儿11'})
15.grandson1 = son1.makeelement('grandson', {'name': '儿11'})
16.# grandson2 = ET.Element('grandson', {'name': '儿12'})
17.grandson2 = son1.makeelement('grandson', {'name': '儿12'})
18.
19.son1.append(grandson1)
20.son1.append(grandson2)
21.
22.# 把儿子添加到根节点中
23.root.append(son1)
24.root.append(son1)
25.
26.tree = ET.ElementTree(root)
27.tree.write('oooo.xml',encoding='utf-8', short_empty_elements=False)

第三种:

1.from xml.etree import ElementTree as ET
2.
3.# 创建根节点
4.root = ET.Element("famliy")
5.
6.# 创建节点大儿子
7.son1 = ET.SubElement(root, "son", attrib={'name': '儿1'})
8.# 创建小儿子
9.son2 = ET.SubElement(root, "son", attrib={"name": "儿2"})
10.
11.# 在大儿子中创建一个孙子
12.grandson1 = ET.SubElement(son1, "age", attrib={'name': '儿11'})
13.grandson1.text = '孙子'
14.
15.et = ET.ElementTree(root)  #生成文档对象
16.et.write("test.xml", encoding="utf-8", xml_declaration=True, short_empty_elements=False)

由于原生保存的XML时默认无缩进,如果想要设置缩进的话, 需要修改保存方式:

1.from xml.etree import ElementTree as ET
2.from xml.dom import minidom
3.
4.def prettify(elem):
5.    """将节点转换成字符串,并添加缩进。
6.    """
7.    rough_string = ET.tostring(elem, 'utf-8')
8.    reparsed = minidom.parseString(rough_string)
9.    return reparsed.toprettyxml(indent="\t")
10.
11.# 创建根节点
12.root = ET.Element("famliy")
13.
14.# 创建大儿子
15.# son1 = ET.Element('son', {'name': '儿1'})
16.son1 = root.makeelement('son', {'name': '儿1'})
17.# 创建小儿子
18.# son2 = ET.Element('son', {"name": '儿2'})
19.son2 = root.makeelement('son', {"name": '儿2'})
20.
21.# 在大儿子中创建两个孙子
22.# grandson1 = ET.Element('grandson', {'name': '儿11'})
23.grandson1 = son1.makeelement('grandson', {'name': '儿11'})
24.# grandson2 = ET.Element('grandson', {'name': '儿12'})
25.grandson2 = son1.makeelement('grandson', {'name': '儿12'})
26.
27.son1.append(grandson1)
28.son1.append(grandson2)
29.
30.# 把儿子添加到根节点中
31.root.append(son1)
32.root.append(son1)
33.
34.raw_str = prettify(root)
35.
36.f = open("xxxoo.xml",'w',encoding='utf-8')
37.f.write(raw_str)
38.f.close()

注意:
从上面代码学到的知识:
1、要迭代寻找节点;使用 .iter()
2、获取节点名字用.tag
3、获取节点属性 .attrib
4、获取某个节点的子节点用 .find;也可以用 for
5、获取标签内容用 .text
6、给当前节点设置属性 .set
7、删除节点和属性 del
8、获取节点属性 get
9、增加子节点 append
10、插入子节点 inster
11、清除指定节点 clear

命名空间

1.from xml.etree import ElementTree as ET
2.
3.ET.register_namespace('com',"http://www.company.com") #some name
4.
5.# build a tree structure
6.root = ET.Element("{http://www.company.com}STUFF")
7.body = ET.SubElement(root, "{http://www.company.com}MORE_STUFF", attrib={"{http://www.company.com}hhh": "123"})
8.body.text = "STUFF EVERYWHERE!"
9.
10.# wrap it in an ElementTree instance, and save as XML
11.tree = ET.ElementTree(root)
12.
13.tree.write("page.xml",
14.           xml_declaration=True,
15.           encoding='utf-8',
16.           method="xml")