在代码单元格中输出可点击html超链接需用ipython.display.html配合display(),直接print()仅显示源码;markdown单元格中可用[文字](url)或标签;动态生成推荐markdown类,注意特殊字符转义和目标地址可达性。

在代码单元格里用 print() 输出 HTML 超链接
纯 Python 的 print() 默认输出是纯文本,不解析 HTML;但 Jupyter 支持在代码单元格中输出富文本,只要显式调用 IPython.display.HTML 或 IPython.display.Markdown。
最稳妥的方式是用 HTML 类包装字符串:
from IPython.display import HTML, display
display(HTML('<a href="https://example.com" target="_blank">跳转到示例网站</a>'))
注意:target="_blank" 很关键,否则链接会在当前 notebook 标签页打开,可能覆盖运行状态;漏掉它容易导致误点后丢失当前工作上下文。
常见错误现象:
- 直接写
print('@#@#@#@#@#@#@#@#@#@0')→ 页面只显示原始 HTML 标签文本,不渲染为可点击链接 - 忘记
display()包裹 → 无任何输出(即使用了HTML()) - 链接含空格或中文未编码 → 点击报
404或跳转失败(应先用urllib.parse.quote()处理)
在 Markdown 单元格里用标准 Markdown 或 HTML 写超链接
这是最常用、最轻量的方式,适合文档说明、资源引用等非动态场景。
两种写法都有效:
- Markdown 语法:
[文字](https://example.com) - 原生 HTML:
@#@#@#@#@#@#@#@#@#@1
区别在于:
- Markdown 链接默认在当前 tab 打开;如需新 tab,必须用 HTML 写法并加
target="_blank" - Markdown 不支持内联样式(比如改颜色、加下划线),HTML 可以:
@#@#@#@#@#@#@#@#@#@2 - Markdown 中链接文字不能换行,HTML 可嵌套
<br>或用div控制布局
用 IPython.display.Markdown 动态生成带链接的文本
当链接地址来自变量、或需拼接时,用 Markdown 类比 HTML 类更简洁,且天然支持 Markdown 语法。
from IPython.display import Markdown, display
url = "https://github.com/jupyter/notebook"
display(Markdown(f"[Jupyter Notebook GitHub 主页]({url})"))
注意:URL 中若含括号、星号等 Markdown 特殊字符,需手动转义(例如 ( → \(),否则解析失败;而 HTML 类无此问题。
性能影响几乎为零,但别在循环里反复调用 display() —— 每次都会插入一个 DOM 节点,大量调用会导致 notebook 渲染变慢甚至卡顿。
为什么不用 webbrowser.open()?
有人尝试在代码里写 import webbrowser; webbrowser.open("https://..."),这在本地执行时会打开系统默认浏览器,但在远程服务器(如超算节点、Azure ML 工作区)上基本无效 —— 因为没有图形桌面环境,webbrowser 会静默失败或抛出 webbrowser.Error。
真正可靠的方案只有两类:
- 在 notebook 前端渲染可点击链接(上述三种方式)
- 输出清晰的 URL 字符串,让用户手动复制粘贴(适合调试、临时分享):
print("请访问:", url)
最容易被忽略的一点:链接目标是否可达,和 notebook 运行环境强相关。比如你在超算节点启动的 notebook,生成的链接指向 localhost:8888,这个地址对外不可达 —— 必须换成实际的代理地址或隧道地址,否则别人点开就是 ERR_CONNECTION_REFUSED。











