Python
基础语法
01概念
02安装
03变量
04字符串
05数
06常量与注释
07列表
08元组
09if语句
10字典
11集合
12复合数据类型对比
13推导式
14用户输入
15while循环
16函数
17类
18面向对象编程
19文件操作
20异常处理
21日期和时间
22魔术方法
23内置函数
24线程
25并发&并行
26正则表达式
27迭代器
28装饰器
29生成器
30上下文管理器
31函数式编程
32闭包
33解包
34工具库
35连接关系型数据库
36虚拟环境
37异步编程
网络爬虫
01urllib库[了解]
02requests库
03数据交换格式
04解析库
05lxml
06Beautiful Soup
07Xpath语法
08动态网页的处理
-
+
首页
03数据交换格式
在 Python 爬虫中,JSON 和 XML 是两种最常见的**结构化数据交换格式**,广泛用于 API 接口返回数据、配置文件、数据传输等场景。 爬虫获取到这两种格式的数据后,需要进行解析才能提取有效信息。 # JSON JSON(JavaScript Object Notation)是一种基于键值对的轻量级数据格式,语法简洁、易于阅读和解析,是当前 API 接口返回数据的主流格式(如 RESTful API)。 ### 基本结构 JSON 数据有两种核心结构,可嵌套组合: - **对象**:用{}包裹的键值对集合,格式为 {"key1": value1, "key2": value2, ...} 键是字符串(必须用双引号),值可以是字符串、数字、布尔值、null、数组或另一个对象。 - **数组**:用[]包裹的有序值集合,格式为 [value1, value2, ...] 值可以是任意 JSON 类型(字符串、数字、对象、数组等)。 ```json { "name": "Python爬虫", "author": { "username": "spider_man", "age": 25 }, "tags": ["爬虫", "Python", "数据解析"], "is_published": true, "views": 10000 } ``` ### 解析json数据 Python 内置json模块,可实现 JSON 字符串与 Python 数据类型(字典、列表等)的相互转换,无需额外安装。 爬虫中常用的操作是**将 API 返回的 JSON 字符串解析为 Python 字典 / 列表**,常用方法如下: | 方法 | 作用 | | ------------------ | ---------------------------------------------------- | | json.loads(s) | 将 JSON 字符串(str)解析为 Python 对象(dict/list) | | json.dumps(obj) | 将 Python 对象(dict/list)转换为 JSON 字符串 | | json.load(fp) | 从文件对象中读取 JSON 并解析为 Python 对象 | | json.dump(obj, fp) | 将 Python 对象写入文件(JSON 格式) | ### 示例 多数 API 返回的是 JSON 格式数据,以爬取 GitHub 的 API 为例: ```python import requests import json # 目标API:获取GitHub上requests库的信息 url = "https://api.github.com/repos/psf/requests" # 发送请求 response = requests.get(url) # 方法1:直接用requests内置的json()方法解析(推荐) data = response.json() # 自动将JSON字符串转为Python字典 print("仓库名称:", data["name"]) print("星标数:", data["stargazers_count"]) print("描述:", data["description"]) # 方法2:用json.loads()解析response.text(等价于方法1) json_str = response.text # 获取JSON字符串 data = json.loads(json_str) # 手动解析 print("语言:", data["language"]) ``` ## XML XML(eXtensible Markup Language)是一种基于标签的标记语言,语法严格(如标签必须闭合、区分大小写),**支持自定义标签和命名空间**,适合表示复杂层级结构的数据(如 RSS 订阅、配置文件、旧系统 API)。 ### 基本结构 XML 由**标签(元素)**、**属性**和**文本内容**组成,有明确的层级关系: - 根元素:整个 XML 有且仅有一个根元素,所有其他元素都嵌套在其内部。 - 元素:用<标签名>和</标签名>包裹,可嵌套子元素。 - 属性:元素的额外信息,格式为 <标签名 属性名="属性值">。 ```xml <bookstore> <book category="编程"> <title lang="en">Python爬虫实战</title> <author>张三</author> <price>59.9</price> </book> <book category="数据科学"> <title lang="zh">数据分析入门</title> <author>李四</author> <price>49.9</price> </book> </bookstore> ``` ### 解析xml数据 Python 解析 XML 的库较多,常用的有: - **xml.etree.ElementTree**:Python 标准库,轻量、易用,适合简单 XML 解析。 - **lxml**:第三方库(基于 C 扩展),功能更强大,支持 XPath 语法和 HTML 解析,是爬虫中的首选。 lxml 是爬虫解析 XML(和 HTML)的利器,支持**XPath 语法**(一种在 XML 中查找信息的语言),可快速定位元素,比ElementTree更高效。 安装: ```cmd pip -install lxml ``` 示例:用 XPath 提取 XML 数据。 ```python from lxml import etree # 解析XML字符串(爬虫中从response.text获取) xml_str = """ <bookstore> <book category="编程"> <title lang="en">Python爬虫实战</title> <author>张三</author> <price>59.9</price> </book> <book category="数据科学"> <title lang="zh">数据分析入门</title> <author>李四</author> <price>49.9</price> </book> </bookstore> """ # 1. 解析XML(etree.HTML()可解析HTML,etree.XML()专门解析XML) root = etree.XML(xml_str) # 2. 用XPath提取数据(XPath语法更简洁) # 提取所有book的category属性 categories = root.xpath("//book/@category") print("所有分类:", categories) # ['编程', '数据科学'] # 提取所有title的文本和lang属性 titles = root.xpath("//title/text()") langs = root.xpath("//title/@lang") for title, lang in zip(titles, langs): print(f"标题:{title},语言:{lang}") # 提取价格>50的book的作者 expensive_authors = root.xpath("//book[price>50]/author/text()") print("价格>50的作者:", expensive_authors) # ['张三'] ``` 输出结果: ```python 所有分类: ['编程', '数据科学'] 标题:Python爬虫实战,语言:en 标题:数据分析入门,语言:zh 价格>50的作者: ['张三'] ``` XPath 常用语法: | XPath 表达式 | 作用 | | ---------------- | -------------------------------------- | | //book | 选取所有\<book>元素(无论层级) | | //book/@category | 选取所有\<book>元素的 category 属性 | | //title/text() | 选取所有\<title>元素的文本内容 | | //book[price>50] | 选取 price 子元素值 > 50 的\<book>元素 | | //book[1] | 选取第一个\<book>元素(索引从 1 开始) | ## 对比 | 特性 | JSON | XML | | -------- | ------------------------------------ | -------------------------------------------- | | 语法 | 简洁(键值对、数组),无标签 | 繁琐(标签嵌套、属性),需严格闭合 | | 可读性 | 人类易读,结构清晰 | 层级复杂时可读性较差 | | 解析速度 | 快(轻量级,无冗余结构) | 较慢(标签和格式占用更多资源) | | 数据类型 | 原生支持字符串、数字、布尔、null 等 | 无原生数据类型,需手动转换(如价格为字符串) | | 扩展性 | 弱(依赖结构约定) | 强(支持命名空间、自定义标签、DTD 验证) | | 适用场景 | API 接口(如 RESTful API)、配置文件 | 旧系统 API、RSS 订阅、复杂层级数据(如文档) | 爬虫中的选择建议: - 若目标是现代 API(如 GitHub API、天气 API),优先处理 JSON,解析简单高效。 - 若遇到旧系统、企业内部接口或特定格式(如 RSS 订阅),需处理 XML,推荐用lxml+XPath 提高效率。 - 无论哪种格式,爬虫中都需先确认数据结构(可通过浏览器开发者工具查看 API 响应),再编写解析逻辑。
毛林
2025年9月7日 12:11
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
PDF文档(打印)
分享
链接
类型
密码
更新密码