知识点1:
ASCII码
诞生于1980s
- 每一个字符都被0~256的数字表示,存储在8位的内存当中(一个字节放一个字符);
- 8位称作为一个‘字节’;
- ord()函数用于告诉我们一个ASCII字符对应的数值是多少。
>>> print(ord('H'))
72
>>> print(ord('\n'))
10
知识点2:
多字节字符
为了处理并表示计算机当中广泛众多的字符,我们不得不用多于一个字节来表示
常见的几种有:
- UTF-8 1-4字节/// UTF-16 2个字节/// UTF-32 4字节
- 向上兼容ASCII码
- 在ASCII码和UTF-8之间自动检测
- UTF-8适合用来对在系统间交换的数据进行编码
在python3当中,所有的字符都是unicode的,在python2当中,是需要相互转化的。
这是python2和python3的第二个区别:
众所周知,byte型和str型本质上是一个东西,因此在python2当中,b前缀和普通字符型是一个东西;
u前缀和普通字符是不一样的东西。
在python3当中,普通字符和u前缀的字符是一样的东西,这个在刚才已经说过了,而b前缀和普通字符是不一样的东西,在这里,b前缀的意思就是表示未经解码的,例如ASCII、UTF-8、UTF-16、UTF-32等编码方式。(联想raw_input())
一般来说,encode ---->byte型
decode----->unicode型
知识点3:
urllib
引出urllib:这是一个其他的库,能为我们自动实现socket库的功能。
由于HTTP十分常见,因此我们拥有urllib库来使得网页能够像文件一样操作。
一下是实例代码:
import urllib.request , urllib.parse , urllib.error
fhand = urllib.request.urlopen('http://data.pr4e.org/romeo.txt')
for line in fhand:
print(line.decode().strip())
值得一提的是:
这里的fhand和之前处理文件的时候是一样的,是提供一种处理文件的方式。
需要注意的是,在解码(decode)前,line是字节数组型,解码后是字符串型。
该程序的输出结果为:
But soft what light through yonder window breaks
It is the east and Juliet is the sun
Arise fair sun and kill the envious moon
Who is already sick and pale with grief
跟之前的相比,这一块只有内容,而没有header,其实header是确确实实存在的,但是不会进入for loop,因此不会在输出结果当中体现。
知识点4:
web scrape(网络爬虫)
需要明确几件事情:
什么是网络爬虫(what’s the web scrape?)
当一个程序或脚本表现为一个浏览器检索网页、检索信息并查看更多网页的时候。
也成为‘spider the web’或者是’web crawl’
实例:
import urllib.request, urllib.parse, urllib.error
from bs4 import BeautifulSoup
import ssl #做一次小的黑客
# Ignore SSL certificate errors
ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE
url = input('Enter - ')
html = urllib.request.urlopen(url, context=ctx).read() #这里得到的结果是utf-8类型
soup = BeautifulSoup(html, 'html.parser') #但是BS知道如何处理utf-8和unicode
# Retrieve all of the anchor tags
tags = soup('a')
for tag in tags:
print(tag.get('href', None))
- 对于SSL的三段代码的解读:是在存在SSL证书错误的问题的时候,那三段代码可以忽略证书错误。
- 因此需要在下面request的时候记得加第二个参数,即context = ctx
- 该段代码的功能就是实现找出所有的anchor tags
点开网页的源代码,可以发现,红框当中就是网页的anchor tag
如果有输入的网页不能够正确返回网址,那么这可能不是URL的问题,有可能是这个网页采用的证书不在python的支持库当中。