要将Clash订阅转换为JSON或Excel格式,可以按照以下步骤编写一个Python脚本:
安装所需的Python库
确保安装了markdown和pandas库:
pip install markdown pandas
编写Clash订阅转换脚本
以下是一个示例Python脚本clash_to_json.py,它将Clash订阅文件转换为JSON格式:
import markdown
from pathlib import Path
import json
def clash_to_json(input_file, output_file):
# 读取Markdown文件
with open(input_file, 'r', encoding='utf-8') as f:
content = f.read()
# 使用markdown解析器解析内容
parser = markdown.Markdown()
subscriptions = parser.parse(content)
# 初始化JSON数组
subscriptions_json = []
for item in subscriptions:
if isinstance(item, markdown.List):
for sub_item in item:
if isinstance(sub_item, markdown.Header):
title = sub_item.text
elif isinstance(sub_item, markdown.Link):
link = {
'标题': title,
'链接': sub_item.href
}
subscriptions_json.append(link)
# 保存JSON文件
with open(output_file, 'w', encoding='utf-8') as f:
json.dump(subscriptions_json, f, indent=2)
if __name__ == '__main__':
input_file = Path('clash_subscriptions.md')
output_file = Path('clash_subscriptions.json')
clash_to_json(input_file, output_file)
使用示例
- 创建一个Clash订阅文件(例如
clash_subscriptions.md如下:
- [基本的订阅](https://example.com) - 作者: user - 更新频率: 每天一次长度: 500字 - 更新日期: 2023-10-01 - [高级订阅](https://example.com/plus) - 作者: user - 更新频率: 每周一次长度: 100字 - 更新日期: 2023-10-02
运行脚本:
python clash_to_json.py
- 生成的JSON文件将保存在
clash_subscriptions.json类似于:
[
{: "基本的订阅",
"链接": "https://example.com",
"作者": "user",
"更新频率": "每天一次",长度": "500字",
"更新日期": "2023-10-01"
},
{: "高级订阅",
"链接": "https://example.com/plus",
"作者": "user",
"更新频率": "每周一次",长度": "100字",
"更新日期": "2023-10-02"
}
]
将JSON转换为Excel
为了将JSON转换为Excel,可以使用pandas库:
import pandas as pd
# 读取JSON文件
data = pd.read_json('clash_subscriptions.json')
# 写入Excel文件
data.to_excel('clash_subscriptions.xlsx', index=False)
完整代码
将上述步骤整合成一个完整的Python脚本:
import markdown
from pathlib import Path
import json
import pandas as pd
def clash_to_json(input_file, output_file):
# 读取Markdown文件
with open(input_file, 'r', encoding='utf-8') as f:
content = f.read()
# 使用markdown解析器解析内容
parser = markdown.Markdown()
subscriptions = parser.parse(content)
# 初始化JSON数组
subscriptions_json = []
for item in subscriptions:
if isinstance(item, markdown.List):
for sub_item in item:
if isinstance(sub_item, markdown.Header):
title = sub_item.text
elif isinstance(sub_item, markdown.Link):
link = {
'标题': title,
'链接': sub_item.href,
'作者': 'user',
'更新频率': '每天一次',
'内容长度': '500字',
'更新日期': '2023-10-01'
}
subscriptions_json.append(link)
# 保存JSON文件
with open(output_file, 'w', encoding='utf-8') as f:
json.dump(subscriptions_json, f, indent=2)
def main():
input_file = Path('clash_subscriptions.md')
output_json = Path('clash_subscriptions.json')
clash_to_json(input_file, output_json)
# 转换为Excel
df = pd.read_json(output_json)
df.to_excel('clash_subscriptions.xlsx', index=False)
if __name__ == '__main__':
main()
处理多个订阅文件
如果有多个Clash订阅文件,可以修改脚本如下:
def clash_to_json(input_dir, output_dir):
input_files = list(input_dir.glob('*.md'))
for input_file in input_files:
output_file = output_dir / input_file.name.replace('.md', '.json')
clash_to_json(input_file, output_file)
# 收集所有JSON文件
all_json_files = list(output_dir.glob('*.json'))
df = pd.DataFrame()
for f in all_json_files:
data = pd.read_json(f)
df = pd.concat([df, data], ignore_index=True)
# 保存到Excel
df.to_excel(output_dir / 'all_subscriptions.xlsx', index=False)
处理不同字段
如果Clash订阅文件的字段结构不同,可以在解析时添加灵活性:
from markdown import Token
from collections import Iterable
def get_children(token):
if isinstance(token, Token.List):
return token
if isinstance(token, Token.ListItem):
children = []
for t in token.tokens:
if isinstance(t, Token.Header):
children.append(t)
elif isinstance(t, Token.Link):
children.append(t)
return children
return []
然后修改clash_to_json函数:
def clash_to_json(input_file, output_file):
with open(input_file, 'r', encoding='utf-8') as f:
content = f.read()
parser = markdown.Markdown()
subscriptions = parser.parse(content)
subscriptions_json = []
for item in subscriptions:
if isinstance(item, markdown.List):
for sub_item in item:
if isinstance(sub_item, markdown.Header):
title = sub_item.text
elif isinstance(sub_item, markdown.Link):
link = {
'标题': title,
'链接': sub_item.href,
'作者': 'user',
'更新频率': '每天一次',
'内容长度': '500字',
'更新日期': '2023-10-01'
}
subscriptions_json.append(link)
with open(output_file, 'w', encoding='utf-8') as f:
json.dump(subscriptions_json, f, indent=2)
处理多个订阅文件的完整代码
将上述函数整合到一个完整的脚本中:
import markdown
from pathlib import Path
import json
import pandas as pd
from collections import Iterable
def get_children(token):
if isinstance(token, Token.List):
return token
if isinstance(token, Token.ListItem):
children = []
for t in token.tokens:
if isinstance(t, Token.Header):
children.append(t)
elif isinstance(t, Token.Link):
children.append(t)
return children
return []
def clash_to_json(input_file, output_file):
with open(input_file, 'r', encoding='utf-8') as f:
content = f.read()
parser = markdown.Markdown()
subscriptions = parser.parse(content)
subscriptions_json = []
for item in subscriptions:
if isinstance(item, markdown.List):
item_children = get_children(item)
for sub_item in item_children:
if isinstance(sub_item, markdown.Header):
title = sub_item.text
elif isinstance(sub_item, markdown.Link):
link = {
'标题': title,
'链接': sub_item.href,
'作者': 'user',
'更新频率': '每天一次',
'内容长度': '500字',
'更新日期': '2023-10-01'
}
subscriptions_json.append(link)
with open(output_file, 'w', encoding='utf-8') as f:
json.dump(subscriptions_json, f, indent=2)
def main():
input_dir = Path('input')
output_dir = Path('output')
# 处理单个文件








