如何用Python BeautifulSoup获取含Jinja占位符的网站翻译内容?
解决Tatoeba网站用BeautifulSoup获取翻译时出现Jinja标签的问题
你遇到的这个问题很典型——Tatoeba的翻译内容是客户端JavaScript渲染的。你用requests拿到的只是页面的静态骨架,那些{{translation.dir}}、{{translation.lang_tag}}都是后端模板引擎留下的占位符,真实的翻译文本是页面加载后通过JavaScript调用API动态填充的,所以直接解析静态HTML肯定拿不到有效内容。
不用Selenium这类浏览器工具的话,最靠谱的方法是直接调用Tatoeba的官方API接口,它会返回结构化的JSON数据,里面直接包含你需要的翻译内容。
具体实现代码
import requests word = "death" # 替换成Tatoeba的搜索API地址 api_url = "https://tatoeba.org/eng/api_v0/search_sentences" # 构造请求参数,和网页搜索的参数对应 request_params = { "query": word, "from": "eng", "to": "deu", "sort": "relevance", # 按相关性排序,可选参数 "page": 1 # 页码,可选参数,用来翻页 } # 模拟浏览器请求头,避免被反爬拦截 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" } response = requests.get(api_url, params=request_params, headers=headers) # 解析JSON响应 search_results = response.json() # 遍历结果,提取原句和德语翻译 for result in search_results["results"]: original_sentence = result["sentence"]["text"] print(f"英文原句: {original_sentence}") # 过滤出德语翻译 for translation in result["translations"]: if translation["lang"] == "deu": print(f"德语翻译: {translation['text']}") print("-" * 30)
为什么这个方法有效?
这个API是Tatoeba前端页面自己用来获取数据的接口,返回的是已经处理好的结构化数据,不需要再处理模板占位符或者前端渲染逻辑。相比解析HTML,用API不仅更稳定,还能轻松实现翻页、排序等功能。
小提示
- 不要频繁发送请求,避免触发网站的反爬限制,建议每次请求之间加一点延迟(比如
time.sleep(1))。 - 如果需要获取更多结果,可以调整
page参数来翻页。
内容的提问来源于stack exchange,提问作者Yes




