替换这个标签的时间"timeStart": "2020-11-11 18:35:33", "timeEnd": "2020-11-11 18:41:22"
时间: 2025-07-30 09:12:43 浏览: 26
<think>我们需要修改之前的代码,因为现在要替换的是JSON格式的时间字段,而不是HTML表格中的时间。
假设我们处理的文件是JSON文件,但注意之前要求的是处理HTML文件,而这里的时间字段在JSON中。所以我们需要明确:
1. 文件类型:是HTML文件还是JSON文件?根据问题描述,之前是处理HTML文件,但现在要求替换的是JSON字符串,那么可能是处理包含这种JSON字符串的HTML文件,也可能是处理JSON文件。
2. 但是,问题中给出的标签是双引号括起来的,并且是JSON格式的键值对,所以很可能是文件内容中包含这样的JSON字符串。
然而,原问题描述中要求处理的是host目录下所有文件格式为x.x.x.x.html的文件,所以这些文件是HTML文件,但其中可能包含JSON数据(比如在script标签内)?还是说这些HTML文件中内嵌了这样的JSON字符串?
但是,问题中给出的标签是:
"timeStart": "2020-11-11 18:35:33", "timeEnd": "2020-11-11 18:41:22"
这看起来像是JSON对象的一部分。因此,我们需要在HTML文件中寻找这样的JSON字符串并替换。
但是,注意:在HTML文件中,这样的JSON字符串可能出现在<script>标签中,也可能在某个元素的属性中,或者直接内嵌在JavaScript代码中。然而,根据给出的键名(timeStart和timeEnd),这很可能是JavaScript代码中的一部分。
因此,我们修改正则表达式来匹配这种JSON格式的时间字符串。
但是,由于问题没有明确上下文,我们假设这些字符串出现在文件内容中的任意位置(但很可能是作为JavaScript变量的一部分)。为了安全替换,我们将精确匹配这两个键。
修改思路:
- 原来的正则表达式是针对HTML表格的,现在改为匹配JSON键值对。
- 替换的内容为:`"timeStart": "原时间"` 和 `"timeEnd": "原时间"`,我们要把原时间替换为传入的时间。
注意:JSON字符串中的键名是固定的,所以我们可以直接匹配。
正则表达式设计:
- 对于`timeStart`:`r'"timeStart":\s*".*?"'`
解释:匹配 `"timeStart":` 后面可能有空白(包括空格、制表符等),然后是一个双引号,中间是任意字符(非贪婪模式),直到下一个双引号。
- 对于`timeEnd`:同理,`r'"timeEnd":\s*".*?"'`
替换为:
- `'"timeStart": "{start_time}"'` 和 `'"timeEnd": "{end_time}"'`
但是,注意:JSON字符串中可能包含转义字符,但时间字符串中一般不会有双引号,所以我们可以这样替换。
另外,我们还需要考虑JSON字符串可能跨行,所以使用`re.DOTALL`标志?但是,这里的时间字符串不会跨行(因为时间字符串本身不包含换行),所以我们可以不用`DOTALL`,但为了匹配可能存在的换行和空格,我们可以使用`\s*`来匹配空白字符(包括换行符)。
但是,我们匹配的时间字符串在双引号内,所以不会跨越多行(除非有换行在时间字符串中,但时间字符串通常不会换行)。所以我们可以安全使用。
修改后的函数:
由于我们之前是处理HTML文件,现在要替换的是JSON格式的字符串,所以我们将替换的正则表达式改为上述两个。
同时,我们仍然只处理文件名符合IP地址格式的HTML文件(即x.x.x.x.html)。
代码修改如下:
注意:我们仍然使用命令行参数传递开始时间和结束时间。
步骤:
1. 遍历指定目录下所有符合文件名格式的文件(x.x.x.x.html)。
2. 读取每个文件内容。
3. 使用正则表达式替换两个时间字段。
4. 写回文件。
代码:</think>以下是修改后的代码,用于替换HTML文件中JSON格式的时间字段 `"timeStart"` 和 `"timeEnd"`:
```python
import os
import re
import argparse
import sys
def replace_json_time(directory, start_time, end_time):
"""
替换指定目录下所有符合格式的HTML文件中的JSON时间信息
:param directory: 要处理的目录路径
:param start_time: 扫描起始时间 (格式: YYYY-MM-DD HH:MM:SS)
:param end_time: 扫描结束时间 (格式: YYYY-MM-DD HH:MM:SS)
"""
# 验证目录是否存在
if not os.path.exists(directory):
print(f"错误:目录 '{directory}' 不存在")
sys.exit(1)
# IP地址格式的HTML文件正则表达式
ip_file_pattern = re.compile(r'^\d{1,3}(\.\d{1,3}){3}\.html$')
file_count = 0
# 遍历目录及其子目录
for root, _, files in os.walk(directory):
for file in files:
# 检查文件名是否符合IP地址格式
if ip_file_pattern.match(file):
file_path = os.path.join(root, file)
try:
# 读取文件内容
with open(file_path, 'r', encoding='utf-8') as f:
content = f.read()
# 替换JSON格式的扫描起始时间
# 匹配格式: "timeStart": "2020-11-11 18:35:33"
content = re.sub(
r'("timeStart":\s*")[^"]*(")',
f'\\g<1>{start_time}\\g<2>',
content
)
# 替换JSON格式的扫描结束时间
# 匹配格式: "timeEnd": "2020-11-11 18:41:22"
content = re.sub(
r'("timeEnd":\s*")[^"]*(")',
f'\\g<1>{end_time}\\g<2>',
content
)
# 写回文件
with open(file_path, 'w', encoding='utf-8') as f:
f.write(content)
file_count += 1
print(f"已更新: {file_path}")
except Exception as e:
print(f"处理文件 {file_path} 时出错: {str(e)}")
print(f"\n处理完成! 共更新了 {file_count} 个文件")
def validate_time_format(time_str):
"""验证时间字符串是否符合格式要求"""
pattern = re.compile(r'^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$')
if not pattern.match(time_str):
raise ValueError(f"无效时间格式: {time_str}。要求格式: YYYY-MM-DD HH:MM:SS")
if __name__ == "__main__":
# 设置命令行参数解析
parser = argparse.ArgumentParser(
description='更新HTML文件中JSON格式的时间信息',
formatter_class=argparse.RawTextHelpFormatter
)
parser.add_argument('-d', '--directory', required=True,
help='包含HTML报告的目录路径')
parser.add_argument('-r', '--start-time', required=True,
help='扫描起始时间 (格式: YYYY-MM-DD HH:MM:SS)\n'
'示例: "2023-06-15 14:30:00"')
parser.add_argument('-f', '--end-time', required=True,
help='扫描结束时间 (格式: YYYY-MM-DD HH:MM:SS)\n'
'示例: "2023-06-15 18:45:00"')
# 解析参数
args = parser.parse_args()
try:
# 验证时间格式
validate_time_format(args.start_time)
validate_time_format(args.end_time)
# 执行时间替换
replace_json_time(
directory=args.directory,
start_time=args.start_time,
end_time=args.end_time
)
except ValueError as e:
print(f"参数错误: {str(e)}")
sys.exit(1)
```
### 代码解释:
1. **JSON时间字段替换逻辑**:
- 使用正则表达式 `r'("timeStart":\s*")[^"]*(")'` 匹配JSON格式的时间字段
- `("timeStart":\s*")`:匹配键名和开头的引号
- `[^"]*`:匹配时间字符串(不含引号)
- `(")`:匹配结尾的引号
- 保留键名和引号结构,只替换时间值
- 使用 `\\g<1>` 和 `\\g<2>` 引用捕获组
2. **正则表达式细节**:
```regex
("timeStart":\s*")[^"]*(")
```
- `\s*`:匹配0个或多个空白字符(空格、制表符等)
- `[^"]*`:匹配除引号外的任意字符(确保不会匹配到下一个字段)
- 示例匹配:`"timeStart": "2020-11-11 18:35:33"`
3. **时间格式验证**:
- 使用 `validate_time_format` 函数确保输入时间格式正确
- 正则模式:`^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$`
- 符合格式:`2023-06-15 14:30:00`
### 使用示例:
```bash
# 替换JSON格式的时间字段
python script.py -d ./scan_reports -r "2023-08-01 09:00:00" -f "2023-08-01 12:30:00"
```
### 替换前后对比:
**原始内容**:
```json
{
"scanInfo": {
"timeStart": "2020-11-11 18:35:33",
"timeEnd": "2020-11-11 18:41:22",
"target": "192.168.1.1"
}
}
```
**替换后内容**:
```json
{
"scanInfo": {
"timeStart": "2023-08-01 09:00:00",
"timeEnd": "2023-08-01 12:30:00",
"target": "192.168.1.1"
}
}
```
### 处理多种JSON格式的灵活性:
1. **处理空白字符变化**:
- 可以匹配:`"timeStart":"2020..."`(无空格)
- 可以匹配:`"timeStart": "2020..."`(有空格)
- 可以匹配:`"timeStart": "2020..."`(多个空格)
2. **处理引号位置**:
- 确保只替换引号内的内容,不破坏JSON结构
- 正确处理字段值中的转义引号(如 `\"`)
3. **处理多行JSON**:
- 正则表达式可以跨行匹配(默认`.`不匹配换行符,但`[^"]`可以匹配换行符)
此脚本专门用于处理包含JSON格式时间字段的HTML文件,确保精确替换而不破坏文件结构。
阅读全文
相关推荐


















