通用解析—bs4+jsonpath
前言
其实大家应该都有所困扰,就是爬虫中的解析。无论是解析HTML还是解析JSON
这里给大家推荐个很好用的方法。
bs4+jsonpath
原理
将 HTML 转换为 JSON 的核心在于解析 HTML 的结构化标签并映射为 JSON 的键值对格式。
HTML 到 JSON 的转换本质上是结构化标记语言到数据交换格式的映射,其核心逻辑包含:
- DOM 树解析:通过解析器将 HTML 标签、属性和文本内容转化为树形结构(如 tag: “div”, attributes: {“class”: “container”}, children: […])
- 递归遍历:深度优先遍历 DOM 节点,将每个节点及其子节点转换为嵌套的 JSON 对象
- 类型处理:区分元素节点(ELEMENT_NODE)和文本节点(TEXT_NODE),后者直接存储为字符串
- 属性提取:将 HTML 标签属性(如 id、class)转换为 JSON 对象的键值对
安装
pip install bs4
pip install jsonpath
使用
from bs4 import BeautifulSoup
import jsondef html_to_json(html):soup = BeautifulSoup(html, 'html.parser')return parse_node(soup)def parse_node(node):if node.name is None: # 文本节点return node.text.strip()result = {"tag": node.name}if node.attrs:result["attrs"] = node.attrsif node.contents:result["children"] = [parse_node(child) for child in node.contents if child.name or child.text.strip()]return result
没错 就是短短的这么几行代码 (可能还是有问题 毕竟是自写+GPT)
这里已经转换成JSON了。但是还远远不够。这里又要使用另一个库
jsonpath
没错,之前这个库可能大家用法只会简单的,但其实结合这个可以通过节点 像AST一样去解析代码。
面对又臭又长的屎山 出值,何尝不是一种乐趣呢?
这里给大家写个通用例子吧。
获取页面中所有的图片
$..*[?(@.tag == 'img')].attrs.src
获取h1标题
$..*[?(@.tag == 'h1').children[0]]
提取内容
$..[?(@.tag == 'div' && @.attrs['class'] =~ /.*content.*/i && !@.children[?(@.tag == 'em')]
)]
结语
只能说偶尔发现的小TIPS ,写多了估计也会腻。适合一些层级比较复杂的网站。理论上可以通杀一些网站的解析~~~
更多的还是依靠jsonpath的解析能力。偶尔水一篇吧 。