字节级替换LTR字符为RTL字符时如何保留希伯来语单词顺序
解决方案
一、字节级替换解决顺序问题
原问题核心是希伯来语为RTL(从右到左)书写系统,但抓取到的占位符按LTR(从左到右)顺序存储,替换后字符顺序与目标单词完全相反。通过反转字节层面的Unicode转义序列,可直接得到正确结果:
data = "יתꢀראꢁ".encode("unicode_escape") # 替换占位符对应的Unicode编码 data = data.replace(b"ua880", b"u05e9") data = data.replace(b"ua881", b"u05d1") # 分割Unicode转义片段,反转后重新拼接 parts = data.split(b"\\u")[1:] # 剔除开头的空元素 parts.reverse() data = b"\\u".join(parts) # 解码得到正确单词 corrected_data = data.decode("unicode_escape") print(corrected_data) # 输出:בראשית
原理:原字符串的Unicode转义顺序为\u05d9\u05ea\uua880\u05e8\u05d0\uua881,反转后变为\uua881\u05d0\u05e8\uua880\u05ea\u05d9,解码后正好匹配希伯来语的RTL阅读顺序。
二、正确抓取希伯来语文本的方案
网页通过自定义WOFF字体映射占位符字符,直接抓取DOM文本只能得到无效占位符,需解析字体文件还原真实字符:
步骤1:提取字体文件URL
查看网页源码,找到@font-face规则中的字体源地址,示例格式:
@font-face { font-family: 'CustomHebrew'; src: url('/path/to/hebrew-font.woff') format('woff'); }
步骤2:解析字体映射关系
使用fonttools库解析字体文件,提取占位符(如U+A880、U+A881)对应的真实希伯来语字符:
from fontTools.ttLib import TTFont import requests # 下载字体文件 font_url = "https://777codes.com/path/to/hebrew-font.woff" font_file = requests.get(font_url).content with open("hebrew-font.woff", "wb") as f: f.write(font_file) # 解析字体获取字符映射 font = TTFont("hebrew-font.woff") cmap = font.getBestCmap() # 整理占位符到真实字符的映射(需根据实际字体调整) char_mapping = { chr(0xA880): chr(0x05E9), # ꢀ → ש chr(0xA881): chr(0x05D1), # ꢁ → ב # 补充其他占位符的映射关系 }
步骤3:批量替换并修正文本顺序
抓取页面文本后,替换占位符并处理RTL顺序:
page_content = requests.get("https://777codes.com/newtestament/gen1.html").text # 批量替换所有占位符 for placeholder, real_char in char_mapping.items(): page_content = page_content.replace(placeholder, real_char) # 对单个希伯来语单词修正顺序(直接反转即可) def fix_rtl_word(word): return word[::-1] # 示例:处理提取到的目标单词 raw_word = "יתꢀראꢁ" replaced_word = raw_word.replace("\ua880", "\u05e9").replace("\ua881", "\u05d1") corrected_word = fix_rtl_word(replaced_word) print(corrected_word) # 输出:בראשית
内容的提问来源于stack exchange,提问作者ShaneO
相关产品推荐
相关产品推荐

