用解析器解析出数据之后, 接下来就是存储数据了保存的形式可以多种多样, 最简单的形式是直接保存为文本文件, 如 TXTJSONCSV 等另外, 还可以保存到数据库中, 如关系型数据库 MySQL, 非关系型数据库 MongoDBRedis 等
5.1 - 文件存储
文件存储形式多种多样, 比如可以保存成 TXT 纯文本形式, 也可以保存为 JSON 格式 CSV 格式等, 本节就来了解一下文本文件的存储方式
将数据保存到 TXT 文本的操作非常简单, 而且 TXT 文本几乎兼容任何平台, 但是这有个缺点, 那就是不利于检索所以如果对检索和数据结构要求不高, 追求方便第一的话, 可以采用 TXT 文本存储本节中, 我们就来看下如何利用 Python 保存 TXT 文本文件
1. 本节目标
本节中, 我们要保存知乎上发现页面的热门话题部分, 将其问题和答案统一保存成文本形式
2. 基本实例
首先, 可以用 requests 将网页源代码获取下来, 然后使用 pyquery 解析库解析, 接下来将提取的标题回答者回答保存到文本, 代码如下:
- import requests
- from pyquery import PyQuery as pq
- url = 'https://www.zhihu.com/explore'
- headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) ApplewebKit/537.36 (Khtml, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
- }
- html = requests.get(url, headers=headers).text
- doc = pq(html)
- items = doc('.explore-tab .feed-item').items()
- for item in items:
- question = item.find('h2').text()
- author = item.find('.author-link-line').text()
- answer = pq(item.find('.content').html()).text()
- file = open('explore.txt', 'a', encoding='utf-8')
- file.write('\n'.join([question, author, answer]))
- file.write('\n' + '=' * 50 + '\n')
- file.close()
这里主要是为了演示文件保存的方式, 因此 requests 异常处理部分在此省去首先, 用 requests 提取知乎的发现页面, 然后将热门话题的问题回答者答案全文提取出来, 然后利用 Python 提供的 open() 方法打开一个文本文件, 获取一个文件操作对象, 这里赋值为 file, 接着利用 file 对象的 write() 方法将提取的内容写入文件, 最后调用 close() 方法将其关闭, 这样抓取的内容即可成功写入文本中了
运行程序, 可以发现在本地生成了一个 explore.txt 文件, 其内容如图 5-1 所示
图 5-1 文件内容
这样热门问答的内容就被保存成文本形式了
这里 open() 方法的第一个参数即要保存的目标文件名称, 第二个参数为 a, 代表以追加方式写入到文本另外, 我们还指定了文件的编码为 utf-8 最后, 写入完成后, 还需要调用 close() 方法来关闭文件对象
3. 打开方式
在刚才的实例中, open() 方法的第二个参数设置成了 a, 这样在每次写入文本时不会清空源文件, 而是在文件末尾写入新的内容, 这是一种文件打开方式关于文件的打开方式, 其实还有其他几种, 这里简要介绍一下
r: 以只读方式打开文件文件的指针将会放在文件的开头这是默认模式
rb: 以二进制只读方式打开一个文件文件指针将会放在文件的开头
r+: 以读写方式打开一个文件文件指针将会放在文件的开头
rb+: 以二进制读写方式打开一个文件文件指针将会放在文件的开头
w: 以写入方式打开一个文件如果该文件已存在, 则将其覆盖如果该文件不存在, 则创建新文件
wb: 以二进制写入方式打开一个文件如果该文件已存在, 则将其覆盖如果该文件不存在, 则创建新文件
w+: 以读写方式打开一个文件如果该文件已存在, 则将其覆盖如果该文件不存在, 则创建新文件
wb+: 以二进制读写格式打开一个文件如果该文件已存在, 则将其覆盖如果该文件不存在, 则创建新文件
a: 以追加方式打开一个文件如果该文件已存在, 文件指针将会放在文件结尾也就是说, 新的内容将会被写入到已有内容之后如果该文件不存在, 则创建新文件来写入
ab: 以二进制追加方式打开一个文件如果该文件已存在, 则文件指针将会放在文件结尾也就是说, 新的内容将会被写入到已有内容之后如果该文件不存在, 则创建新文件来写入
a+: 以读写方式打开一个文件如果该文件已存在, 文件指针将会放在文件的结尾文件打开时会是追加模式如果该文件不存在, 则创建新文件来读写
ab+: 以二进制追加方式打开一个文件如果该文件已存在, 则文件指针将会放在文件结尾如果该文件不存在, 则创建新文件用于读写
4. 简化写法
另外, 文件写入还有一种简写方法, 那就是使用 with as 语法在 with 控制块结束时, 文件会自动关闭, 所以就不需要再调用 close() 方法了这种保存方式可以简写如下:
- with open('explore.txt', 'a', encoding='utf-8') as file:
- file.write('\n'.join([question, author, answer]))
- file.write('\n' + '=' * 50 + '\n')
如果想保存时将原文清空, 那么可以将第二个参数改写为 w, 代码如下:
- with open('explore.txt', 'w', encoding='utf-8') as file:
- file.write('\n'.join([question, author, answer]))
- file.write('\n' + '=' * 50 + '\n')
上面便是利用 Python 将结果保存为 TXT 文件的方法, 这种方法简单易用, 操作高效, 是一种最基本的保存数据的方法
来源: https://juejin.im/post/5ab22accf265da239a5fb172