使用re.search与'in'无法检测bs4解析节点中日期子串的问题
解决方法
1. 排查字符编码差异
先打印两个字符串每个字符的Unicode编码,确认是否存在肉眼不可见的差异:
def print_char_details(s): for idx, char in enumerate(s): print(f"位置 {idx}: '{char}' - Unicode码点 U+{ord(char):04X}") # 打印目标日期的字符细节 print("=== 目标日期字符详情 ===") print_char_details(second_date.strip().lower()) # 打印节点文本的字符详情 print("\n=== 节点文本字符详情 ===") print_char_details(node.text.strip().lower())
对比输出,重点关注:
- 空格是否为普通空格(U+0020),还是其他Unicode空格(如U+2002、U+2003)
- 逗号、数字是否为半角格式(逗号U+002C,数字U+0030-U+0039),而非全角(逗号U+FF0C,数字U+FF10-U+FF19)
- 是否存在零宽字符(如U+200B零宽空格)
2. 全面清理字符串特殊字符
替换所有Unicode空白字符,并统一全角/半角字符:
方法一:正则批量替换空白字符
import re with open(filepath, 'r', encoding="utf-8", errors="ignore") as file: content = file.read() # 替换所有Unicode空白字符为普通空格,合并连续空格 content = re.sub(r'\s+', ' ', content) # 可选:将全角逗号、数字转为半角 content = content.replace(',', ',').replace('0','0').replace('1','1').replace('2','2').replace('3','3').replace('4','4').replace('5','5').replace('6','6').replace('7','7').replace('8','8').replace('9','9')
方法二:Unicode标准化处理
import unicodedata import re with open(filepath, 'r', encoding="utf-8", errors="ignore") as file: content = file.read() # NFKC标准化:统一全角/半角、兼容字符格式 content = unicodedata.normalize('NFKC', content) # 合并连续空格 content = re.sub(r'\s+', ' ', content)
3. 确认节点文本完整性
如果上述方法无效,检查当前遍历的node是否真的包含完整日期文本:
- 打印节点的HTML结构,确认日期未被拆分到子节点:
print(node.prettify())
若日期分散在多个子节点,需调整遍历逻辑(比如遍历父节点或合并子节点文本)。
内容的提问来源于stack exchange,提问作者NecroaNova
相关产品推荐
相关产品推荐

