txt文件读写
import requests
from pyquery import PyQuery as pq
url = 'https://www.zhihu.com/explore'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 '
'(KHTML, like Gecko) Chrome/86.0.4209.2 Safari/537.36'
}
html = requests.get(url=url, headers=headers, timeout=2).text
doc = pq(html)
items = doc('.ExploreSpecialCard-contentItem').items()
for item in items:
tag = item.find('a.ExploreSpecialCard-contentTag').text()
title = item.find('a.ExploreSpecialCard-contentTitle').text()
with open('explore.txt', 'a', encoding='utf-8') as f:
f.write('\n'.join([tag, title]))
json
import json
str = '''
[{
"name": "Bob",
"gender": "male",
"age": "20"
},{
"name": "Mike",
"gender": "male",
"age": "19"
},{
"name": "李华",
"gender": "男",
"age": "25"
}]
'''
'''
json格式的数值必须使用双引号包裹,否则loads()解析会失败
'''
print(str)
print(type(str))
data = json.loads(str)
print(data)
print(type(data))
'''
通过json.load()方法返回的是一个列表对象
可以通过索引来获取data中的数据
'''
'''
object_hook 是一个可选的函数,它会被调用于每一个解码出的对象字面量(即一个 dict)
object_hook 的返回值会取代原本的 dict。这一特性能够被用于实现自定义解码器(如 JSON-RPC 的类型提示)
object_pairs_hook 是一个可选的函数,它会被调用于每一个有序列表对解码出的对象字面量
object_pairs_hook 的返回值将会取代原本的 dict 。这一特性能够被用于实现自定义解码器
!!! 如果 object_hook 也被定义, object_pairs_hook 优先。
parse_float 如果指定,将与每个要解码JSON浮点数的字符串一同调用
默认状态下,相当于 float(num_str)
可以用于对 JSON 浮点数使用其它数据类型和语法分析程序 (比如 decimal.Decimal )
parse_int ,如果指定,将与每个要解码 JSON 整数的字符串一同调用
默认状态下,相当于 int(num_str) 。可以用于对 JSON 整数使用其它数据类型和语法分析程序 (比如 float )
parse_constant ,如果指定,将要与以下字符串中的一个一同调用: '-Infinity' , 'Infinity' , 'NaN'
如果遇到无效的 JSON 数字则可以使用它引发异常。
'''
print(data[0]['name'])
print(data[0].get('name'))
'''
可以通过data[0]['name']、data[0].get('name')这两种方法获取属性值
这里建议使用get,这样的话当属性不存在时不会报错,会返回None
'''
print(data[0].get('birthday'))
print(data[0].get('birthday', '2000-8-29'))
'''
get的第二个值表示默认数值
'''
with open('data.json', 'w', encoding='utf-8') as f:
f.write(json.dumps(data, indent=2, ensure_ascii=False))
'''
indent表示缩进格数,为了保持json格式
ensure_ascii用来保证中文等不会出现使用Unicode表示
'''
'''
skipkeys=True(默认为 False),那些不是基本对象(包括 str, int、float、bool、None)的字典的键会被跳过
否则引发一个 TypeError
ensure_ascii=True(默认值)输出保证将所有输入的非 ASCII 字符转义
如果 ensure_ascii=False,这些字符会原样输出
check_circular=False(默认为 True),容器类型的循环引用检验会被跳过并且循环引用会引发一个OverflowError
allow_nan=False(默认为 True),那么在对严格 JSON 规格范围外的 float 类型值(nan、inf 和 -inf)
进行序列化时会引发一个 ValueError
如果 allow_nan=True,则使用它们的 JavaScript 等价形式(NaN、Infinity 和 -Infinity)
indent 是一个非负整数或者字符串,那么 JSON 数组元素和对象成员会被美化输出为该值指定的缩进等级
当separators被指定时,其应当是一个(item_separator, key_separator))元组
当indent为None时,默认值取 (', ', ': '),否则取 (',', ': ')
为了得到最紧凑的 JSON 表达式,应该指定其为 (',', ':') 以消除空白字符
当 default 被指定时,其应该是一个函数,每当某个对象无法被序列化时它会被调用
它应该返回该对象的一个可以被 JSON 编码的版本或者引发一个 TypeError
如果没有被指定,则会直接引发 TypeError
sort_keys=true(默认为 False),那么字典的输出会以键的顺序排序
'''
print(json.dumps(float('-inf')))
print(json.dumps(float('nan')))
print(json.loads('-Infinity'))
print(json.loads('NaN'))
'''
默认情况下,解码执行以下翻译:
JSON Python
object dict
array list
string str
number(int) int
number(real)float
true True
false False
null None
strict=false(默认为 True),那么控制字符将被允许在字符串内
在此上下文中的控制字符编码在范围 0--31 内的字符,包括 '\t' (制表符), '\n' , '\r' 和 '\0'
# decode(s)返回s的 Python表示形式(包含一个 JSON 文档的 str 实例)
如果给定的 JSON 文档无效则将引发 JSONDecodeError
# raw_decode(s)
从s中解码出 JSON 文档(以 JSON 文档开头的一个 str 对象)
并返回一个 Python 表示形式为2元组以及指明该文档在 s 中结束位置的序号。
'''
'''
msg 未格式化的错误消息
doc 正在解析的 JSON 文档
pos 解析失败的索引
lineno 解析的行
colno 解析的列
'''
'''
默认支持以下对象和类型:
Python JSON
dict object
list, tuple array
str string
int, float, int 和 float 派生的枚举 number
True true
False false
None null
'''