You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用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

火山引擎 最新活动