python使用 re.findall、content 和 json 提取数据:从网页内容到结构化信息

在实际开发中,我们经常需要从网页内容(content)中提取数据,并将其转换为结构化信息(如 JSON)。Python 提供了强大的工具来实现这一目标,包括 re 模块的正则表达式功能、requests 库获取网页内容,以及 json 模块处理 JSON 数据。本文将详细介绍如何使用这些工具完成数据提取任务。


1. 获取网页内容(content

在提取数据之前,我们需要先获取网页的内容。通常使用 requests 库来发送 HTTP 请求并获取网页的 HTML 内容。

import requests

import requests

# 发送 HTTP 请求获取网页内容
response = requests.get(url="https://www.baidu.com")

# 手动设置编码
response.encoding = "utf-8"

# 获取网页内容
content = response.text
print(content)

注意点: Python 在打印内容时,默认使用了 gbk 编码,而网页内容中可能包含 gbk 编码无法处理的字符(例如 UTF-8 编码的非 ASCII 字符),会报错:UnicodeEncodeError: 'gbk' codec can't encode character '\xe7' in position 318: illegal multibyte sequence
在上面代码中直接手动设置编码

2. 使用 re.findall 提取数据

获取网页内容后,我们可以使用 re.findall 从 HTML 中提取所需的数据。re.findall 是正则表达式的核心函数之一,用于查找所有匹配的子串。

 2.1 单个正常表达式提取

import requests
import re
test = requests.get(url="https://www.baidu.com")
test.encoding = "utf-8" #加上utf-8
a = test.text
lista = re.findall("<title>(.+?)</title>",a)#返回列表的数据
print(lista[0])

2.2 多个正则表达式提取

 2.2.1 将今日的博客云的新闻标题全部提取

2.2.2 打开在线正则表达式测试,将python输入的结果复制,粘贴到在线正则表式上

2.2.3 找到第一个和第二个新闻的标签,复制到记事本上,发现规律,id不一样,将id和标题内容替换为正则表达式,在2.2.2的正则表达式上粘贴,点击匹配

2.2.4 发现30个,在python中写一个循环,取全部的数据
 

import requests
import re
test = requests.get(url="https://news.cnblogs.com/")
lista = re.findall('<a href="/n/(.+?)/" target="_blank">(.+?)</a>',test.text)
for i in range(29): #30个数据,返回的是列表,变化的只有第一个
    print(lista[i][1])


3. 使用 json 模块处理结构化数据

提取的数据通常需要进一步处理,转换为结构化格式(如 JSON)。json 模块提供了将字符串解析为 Python 对象(如字典、列表)的功能。

3.1安装jsonpath

pip install josnpath


3.2 json字符串转换成 json对象 == jsonpath

import json

import requests
import re
import jsonpath

url_params = {
    'appid':'微信公众号id',
    'secret':'微信公众号secret',
    'grant_type':'client_credential'
}

response = requests.get(url='https://api.weixin.qq.com/cgi-bin/token',params=url_params)
body_str =response.text
print(body_str)
body_json = json.loads(body_str) #将字符串转换对象
token = jsonpath.jsonpath(body_json,'$.access_token')
print(token[0])

3.3 响应正文直接转换json对象返回

import requests
import re
import jsonpath

url_params = {
    'appid':'微信公众号id',
    'secret':'微信公众号secret',
    'grant_type':'client_credential'
}

response = requests.get(url='https://api.weixin.qq.com/cgi-bin/token',params=url_params)
body_json = response.json()
token = jsonpath.jsonpath(body_json,'$.access_token')
print(token[0])