Python-spider

一、json数据

​ 导入语法:import json

  1. json的作用(让不同编程语言之间可以进行有效的数据交流(几乎所有的高级语言都支持json数据格式))
  2. 什么是json数据(一个有效的ijson有且只有一个数据,并且唯一的这个数据必须是json支持的类型的数据。)
1
2
3
4
5
6
7
8
9
"""
json支持的数据类型:
数字 - 直接写,例如:100、+23、-45、12.5、3e4
字符串 - 加双引号,只有双引号,例如:"字符串1"、"字符串2"、"换行符"等
布尔 - 只有true和false两个值
空值 - null
数组(列表) - 相当于Python的列表: [元素1, 元素2, 元素3,...]
字典 - 键必须是字符串: {键1:值1, 键2:值2,...}
"""
  1. json数据的解析

    1) 如果通过requests发送请求得到的数据就是json数据,可以直接用响应.json()将json数据转换成Python数据

    2)非json接口提供的json数据的解析

1
2
3
4
5
6
7
8
"""
系统模块:json -> 提供将json数据转换成Python数据,以及将Python数据转换成json数据两个功能
json.loads(json格式的字符串) - 将json转Python,返回值的类型会因为字符串的内容不同而不一样
json.dumps(python数据) - 将Python数据转换json格式的字符串,返回值是字符串

说明:json格式的字符串 - 字符串的内容是json格式的数据,例如:'100'、'"abc"'、'{"a": 100}'
int、float、str、bool、list、dict、None、tuple - 可以转成json数据
"""
二、xpath数据解析

导入语法:from lxml import etree

​ lxml: 可以通过xpath的方法来解析html数据和xml数据

  1. 创建树结构,获取根节点

#etree.HTML(html代码) - 将html页面创建成一个树结构,并且返回树的根节点

1
html_node = etree.HTML(open('files/网页.html').read())
  1. 根据路径获取指定标签

#节点对象.xpath(路径) - 返回值是列表,列表中的元素就根据路径找到的所有的结果

​ 1)绝对路径 - /从根节点开始写全路径 # 注意:绝对的写法和查找方式跟前面谁去.xpath没有关系

1
2
h1_node = html_node.xpath('/html/body/div/h1')[0]
print(h1_node) # <Element h1 at 0x1108cf500>

​ 2)相对路径: ./路径、../路径 注意: 用.表示当前节点 (谁去.xpath,当前节点就是谁)

1
2
result = html_node.xpath('./body/div/p')
print(result)

​ 3)全局搜索: //; //路径

1
2
result = html_node.xpath('//img')  # 全部的img节点
print(result)
  1. 获取标签内容和标签属性
1)标签内容:获取标签的路径/text()
1
2
result = html_node.xpath('//p/text()')
print(result)

​ 2)属性值:获取标签的路径/@属性名

1
2
result = html_node.xpath('//img/@src')
print(result)
  1. 谓语

    1)[N] - 获取第N个(同级中取第N个)

1
2
result = html_node.xpath('//p[1]/text()')
print(result)

​ 2) [last()] - 取最后一个(同级最后一个)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
result = html_node.xpath('//ul/li[last()]/p/text()')
print(result)
# [last()-1] - 倒数第2个
# [last()-2] - 倒数第3个
result = html_node.xpath('//ul/li[last()-1]/p/text()')
print(result
result = html_node.xpath('//ul/li[last()-2]/p/text()')
print(result
# [position() < 3] - (1, 2)获取前两个
# [position() <= 3] - (1,2,3)获取前3个
# [position() > 1] - 从第2开始取完
result = html_node.xpath('//ul/li[position()<=2]/p/text()')
print(result)

result = html_node.xpath('//ul/li[position()>1]/p/text()')
print(result)

​ 3)属性相关谓语

[@属性名=值] - 获取指定属性为指定值的标签

1
2
result = html_node.xpath('./body/div[1]/p[@class="c1"]/text()')
print(result)
  1. 通配符

1)* - 通配符,表示所有类型的标签

1
2
result = html_node.xpath('//*[@class="c1"]/text()')
print(result)
  1. 分支

    1)路径1|路径2 - 按照两种路径获取标签

1
2
result = html_node.xpath('./body/div[1]/a|./body/div[1]/p')
print(result)

Python-spider
http://example.com/2024/02/20/python-爬虫/
发布于
2024年2月20日
许可协议