geekdoc-python-zh/docs/realpython/html-css-python.md

58 KiB
Raw Blame History

面向 Python 开发者的 HTML 和 CSS

原文:https://realpython.com/html-css-python/

当你想作为一个 Python 程序员来构建网站时,没有办法绕开 HTML 和 CSS。几乎互联网上的每个网站都是用 HTML 标记来构建页面的。为了让网站看起来漂亮,你可以用 CSS 来设计 HTML 的样式。

如果你对使用 Python 进行 web 开发感兴趣,那么了解 HTML 和 CSS 将有助于你更好地理解像 DjangoFlask 这样的 web 框架。但是,即使你刚刚开始使用 PythonHTML 和 CSS 也能让你创建小网站来打动你的朋友。

在本教程中,您将学习如何:

  • 构建一个基本的 HTML 文件
  • 在您的浏览器中查看和检查 HTML
  • 插入图片和页面链接
  • CSS 设计一个网站
  • 考虑到可访问性来格式化 HTML
  • 使用 Python 编写和解析 HTML 代码

您将获得 HTML 和 CSS 的介绍,您可以跟随。在本教程中,您将构建一个包含三个页面和 CSS 样式的网站:

https://player.vimeo.com/video/740468859?background=1

在创建 web 项目时,您将创建一个样板 HTML 文档,您可以在即将到来的 web 项目中使用它。您可能会发现,当您从事未来的项目时,源代码会派上用场。您可以从这里下载:

免费奖励: 点击这里下载本教程的补充资料,包括一个省时的 HTML 模板文件。

在学习了 HTML 和 CSS 的基础知识之后,你会在教程的最后找到如何继续你的旅程的想法。

创建你的第一个 HTML 文件

想一想你最近访问过的任何网站。也许你看了一些新闻,和朋友聊了聊,或者看了一段视频。不管它是什么样的网站,你可以打赌它的源代码在开头有一个基本的<html>标签。

HTML 代表超文本标记语言。HTML 是由蒂姆·伯纳斯·李创造的,作为万维网的发明者,他的名字可能也让你想起来了。

HTML 的超文本部分指的是在不同的 HTML 页面之间建立连接。有了超链接,你就可以在网页之间跳转,在网上冲浪。

您使用标记来组织文档中的内容。与格式相反,标记定义了内容的含义,而不是内容的外观。在本节中,您将了解 HTML 元素及其角色。

编写语义 HTML 代码将使你的文档能够被广泛的访问者访问。毕竟,你想让每个人都能消费你的内容,不管他们是用浏览器还是用屏幕阅读工具访问你的页面。

对于每个 HTML 元素都有一个定义其预期用途的标准。今天HTML 的标准是由 Web 超文本应用技术工作组(WHATWG) 定义的。WHATWG 对 HTML 的作用类似于 Python 指导委员会对 Python 的作用。

大约 95%的网站使用 HTML ,所以如果你想用 Python 做任何网络开发工作,你将很难避免它。

在本节中,您将从创建第一个 HTML 文件开始。您将学习如何构建您的 HTML 代码,使其对您的浏览器和人类可读。

Remove ads

HTML 文档

在本节中,您将创建一个基本的 HTML 文件。HTML 文件将包含大多数网站的基本结构。

首先,创建一个名为index.html的文件,其中包含一些文本:

 1<!-- index.html -->
 2
 3Am I HTML already?

传统上,你网站的第一个文件叫做index.html。您可以将index.html页面视为类似于 Python 项目中的main.pyapp.py文件。

**注意:**除非你的服务器配置不同,index.html是当你访问根 URL 时服务器试图加载的文件。这就是为什么你可以访问https://www.example.com/而不是输入完整的https://www.example.com/index.html地址。

到目前为止,index.html的唯一内容是一个普通的Am I HTML already?字符串。您还没有添加任何 HTML 语法,除了第 1 行的一个 HTML 注释。类似于 Python 解释器不执行你的 Python 代码中的注释,浏览器不会呈现你的 HTML 注释的内容。尽管如此,请在浏览器中打开index.html:

Plain text HTML page.

你的浏览器显示文本时没有抱怨。看起来浏览器可以处理 HTML 文件,即使它的唯一提示是扩展名。知道这一点很好,但这种行为也有不好的一面。

浏览器总是试图呈现 HTML 文档,即使文档的 HTML 语法无效。很少,浏览器本身会显示类似于语法错误的东西,类似于当你试图运行无效代码时 Python 所做的。这意味着您可能不会注意到您是否发布了无效代码,这可能会给网站访问者带来问题。

**注意:**如果你想验证你写的 HTML 代码,那么你可以上传你的 HTML 文件到 W3C 标记验证服务。这个林挺工具分析你的代码并指出错误。

更新index.html并通过添加以下代码创建一个最小有效的 HTML 文档:

 1<!-- index.html -->
 2
 3<!DOCTYPE html>
 4<html lang="en">
 5<head>
 6    <meta charset="utf-8">
 7    <title>Am I HTML already?</title>
 8</head>
 9</html>

这段代码是你能得到的最简单有效的 HTML 文档。严格地说,您甚至可以删除第 4 行中的lang 属性。但是建议添加正确的语言子标签来声明您的文档包含哪种自然语言。

**注意:**在本教程中,您将坚持使用英语并使用en语言标签。你可以访问官方语言子标签注册表来查找所有其他语言标签。

语言属性使翻译工具更容易使用您的网站,并使您的网站更容易访问。屏幕阅读器特别依赖 HTML 文档的语言声明来选择正确的语言模式来合成内容。

从根本上说,您构建的任何 HTML 文档都可能遵循上面示例的结构。但是缺少了一个重要的 HTML 元素。打开index.html,在<head>下面增加<body>:

 1<!-- index.html -->
 2
 3<!DOCTYPE html>
 4<html lang="en">
 5<head>
 6    <meta charset="utf-8">
 7    <title>Am I HTML already?</title>
 8</head>
 9<body> 10Yes,<br>I am! 11</body> 12</html>

任何有效的 HTML 文件都必须以一个 doctype 声明开始。在本教程中,您将使用<!DOCTYPE html>,它告诉浏览器文档包含 HTML5 代码,应该以标准模式呈现您的页面:

如果浏览器在页面开始处发现一个过时的、不完整的或丢失的 doctype他们使用“怪癖模式”这种模式更向后兼容旧的实践和旧的浏览器。(来源)

在 doctype 声明之后,有一个开始的<html>标记。在第 12 行,您可以找到相应的结束标签</html>。HTML 中的大多数元素都有一个开始标签,中间有一些内容,最后有一个结束标签。这些部分甚至可以在同一行,像第 7 行中的<title>元素。

其他元素,比如第 6 行的<meta>,没有匹配的结束标记,所以它们不包含任何内容。这些空元素就是所谓的空元素。它们独立存在,甚至可能不包含属性。第 10 行中的<br>就是这样一个例子,它创建了一个换行符。

HTML 标签以尖括号(<)开始,以尖括号(>)结束。尖括号中的标签名通常是非常描述性的,说明了 HTML 元素的含义。一个很好的例子是第 7 行的<title>,其中的内容定义了页面的标题。

<body>块包含了你的大部分内容。您可以将<body>视为 HTML 文档的一部分,您可以在浏览器中与之交互。

有时候标签名是缩写的,比如第 10 行的换行符<br>。要获得其他 HTML 标签名称的概述,请访问 Mozilla 的 HTML 元素参考

一旦你熟悉了你的 HTML 文档的结构,在你的浏览器中重新加载index.html并检查你的网站看起来如何:

Screenshot of a basic HTML page.

太棒了,你现在正在显示你的第一个正式网站的内容!

您很有可能会以类似于本节中构建的结构开始任何 web 项目。为了在将来节省一些工作,您可以通过单击下面的链接下载 HTML 样板代码:

免费奖励: 点击这里下载本教程的补充资料,包括一个省时的 HTML 模板文件。

在下一节中,您将改进到目前为止已经创建的基础结构。为了探究为什么 HTML 被称为标记语言,您将向您的网站添加内容和结构。

Remove ads

空白和文本格式

到目前为止HTML 文档仅有的标记是网站的基本框架。现在是时候深入研究并构建一些真正的内容了。要使用某些内容,请将以下文本添加到index.html<body>块中:

 1<!-- index.html -->
 2
 3<!DOCTYPE html>
 4<html lang="en">
 5<head>
 6    <meta charset="utf-8">
 7    <title>Am I HTML already?</title>
 8</head>
 9<body>
10Hello, World Wide Web! 11This is my first website. 12 13About me 14 15I'm a Python programmer and a bug collector. 16 17Random facts 18 19I don't just like emoji, 20I love emoji! 21 22My most-used emoji are: 23    1\. 🐞 24    2\. 🐍 25    3\. 👍 26 27Links 28 29My favorite websites are: 30    * realpython.com 31    * python.org 32    * pypi.org 33</body>
34</html>
```py

当您在浏览器中打开网站时,浏览器似乎根本没有识别任何空格。尽管您在`<body>`中将内容分布在多行上,但浏览器将所有内容显示为一个连续的行:

[![Screenshot of a HTML page without any markup elements.](img/fce9bdb896ea4b01b1839419ad73a5cd.png)](https://files.realpython.com/media/03-index-whitespace.1920593829ce.png)

作为一名 Python 开发人员,您知道空白是编写漂亮的 Python 代码的重要组成部分。Python 代码的缩进会影响 Python 执行代码的方式。

无需任何额外的调整,浏览器将多个空格、换行符或缩进折叠成一个空格字符。要以不同的方式设置内容的格式,您必须向浏览器提供进一步的信息。继续通过向您的内容添加 HTML 标签来构建`index.html`:

1 2 3 4<html lang="en"> 5<head> 6 7 8</head> 9 10

Hello, World Wide Web!

11

This is my first website.

12 13

About me

14

I'm a Python programmer and a bug collector.

15 16

Random facts

17

I don't just like emoji,
18I love emoji!

19

My most-used emoji are:

20
    21
  1. 🐞
  2. 22
  3. 🐍
  4. 23
  5. 👍
  6. 24
25 26

Links

27

My favorite websites are:

28
    29
  • realpython.com
  • 30
  • python.org
  • 31
  • pypi.org
  • 32
33 34</html>


通过将文本包装在 HTML 块中可以向浏览器提供关于内容意图的附加信息首先看看包装大块文本的 HTML 元素:

| 线条 | HTML 元素 | 描述 |
| --- | --- | --- |
| Ten | `<h1>` | 你网站的主要标题 |
| Eleven | `<p>` | 段落用于组织文本和相关内容 |
| Thirteen | `<h2>` | 二级标题嵌套在`<h1>`下面 |
| Sixteen | `<h3>` | 第三级标题嵌套在`<h2>`下面 |
| Twenty | `<ol>` | 有序列表通常呈现为编号列表 |
| Twenty-eight | `<ul>` | 无序列表通常用项目符号(`•`)呈现 |

标题元素可以嵌套六层虽然你通常只有一个`<h1>`元素但你可能有多个`<h2>``<h6>`标签标题元素是 HTML 文档的一部分对于屏幕阅读器来说非常重要例如读者可能想从一个标题跳到另一个标题来浏览你的内容

要编写有效且可访问的 HTML您必须确保在代码中不跳过标题级别你可以把标题标签想象成打开一栋建筑不同楼层的门一个楼层可以有多个出口通往其他楼层但是记住如果你还没有第二层你就不能建第三层换句话说除非您首先声明了`<h2>`否则页面上永远不会有`<h3>`元素

您在上面使用的一些 HTML 元素只包含文本其他包含额外的 HTML 元素进一步组织内容:

| 线条 | HTML 元素 | 描述 |
| --- | --- | --- |
| Seventeen | `<em>` | 强调内容 |
| Eighteen | `<strong>` | 表示重要内容 |
| Twenty-one | `<li>` | 列表项必须包含在列表元素中 |

所有的 HTML 标签都传达意义因此仔细选择用于部分内容的标记非常重要当你使用正确的语义时你就能让每个人以你想要的方式消费你的内容您让所有人都可以访问您的网站:

> 网络基本上是为所有人而设计的不管他们的硬件软件语言位置或能力如何当网络满足这一目标时具有不同听觉运动视觉和认知能力的人都可以访问它([来源](https://www.w3.org/WAI/fundamentals/accessibility-intro/))

一些 HTML 元素非常简单对于段落你使用`<p>`。其他元素有点难以理解:



Kushagra Gour 在他的博客条目 [Strong vs Em](https://kushagra.dev/blog/strong-vs-em/) 中提供了一个很好的总结:

> 如果只是视觉重要性你要`strong`。如果它改变了句子的意思使用`em`。

换句话说`em`意味着你在说话时会强调这个词例如如果有人说,“你看起来不像 T2 那么坏,”你可能会想,“但是我闻起来像 T4 ?”强调的位置是句子意思的关键

例如如果你只是想把读者的注意力吸引到一个词汇上那么你可能会想用`strong`来代替

如果有疑问不要犹豫在网上搜索 HTML 名称你可以找到关于任何 HTML 元素的讨论和用法说明

此外浏览器的默认 HTML 样式通过对元素进行不同的样式化可以给人一种不错的印象:

[![Screenshot of an HTML page with default browser styling.](img/dabd04833796d15c25fcdef2d333451f.png)](https://files.realpython.com/media/04-index-default-styling.ba56dcefe632.png)

有了标记你就可以给网站内容增加意义编写语义正确的 HTML 对于理解你的内容很重要

 HTML 文档中使用正确的语义不仅对浏览器有帮助它还使使用[文本到语音转换](https://en.wikipedia.org/wiki/Speech_synthesis)软件的用户可以访问呈现的 HTML 页面

如果你想了解更多关于现代 HTML 的知识那么 [HTML5 Doctor](https://html5doctor.com) 是一个很好的资源要了解更多关于可访问性的信息你可以查看谷歌关于让所有人都能访问网络[的课程](https://web.dev/accessible/)

[*Remove ads*](/account/join/)

### 链接、图像和表格

从一个网站跳到另一个网站是互联网的重要组成部分这些引用被称为**超链接**通常被称为**链接**如果没有链接网站就会孤立存在只有知道网址才能访问

此外如果没有连接页面的链接您将无法在网站的多个页面之间导航要连接到目前为止已经创建的 HTML 文档请在 HTML 源代码中添加一个导航菜单:

<html lang="en"> <head> </head> Emoji </html> ```py

使用<nav>元素,您可以声明一个提供导航的部分。在<nav>中,您添加了一个带有<a>标签的链接,这是 anchor 的缩写。href属性代表超文本链接,包含链接的目标。

通过相对链接,你可以引用你的目录树中的文件。当你有一个链接时,你可能希望看到一个 URL但是相对链接不是这样。

在这种情况下,您链接到一个名为emoji.html的文件。浏览器明白可以在同一个目录下找到emoji.html,为你完成完整的 URL。这样当您决定在某个时候部署您的 web 项目时,您不需要担心改变任何绝对路径。

到目前为止,emoji.html还不存在。要解决这个问题,在index.html旁边创建一个名为emoji.html的新文件:

<!-- emoji.html-->

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>My favorite emoji</title>
</head>
<body>
<nav>
    <a href="index.html">Home</a>
</nav>
<h1>My favorite emoji</h1>
<p>I don't just <em>like</em> emoji,<br>
I <strong>love</strong> emoji!</p>
<p>Here's a list of my most-used emoji:</p>
<ol>
    <li>🐞</li>
    <li>🐍</li>
    <li>👍</li>
</ol>
</body>
</html>
```py

`emoji.html`的结构和`index.html`类似。`emoji.html`中的`<body>`的内容与`index.html`的随机事实部分几乎相同,除了你改变了标题并将其上移一级为`<h1>`。

在`<body>`的顶部,你还有一个`<nav>`元素。然而,这一次,你链接到了`index.html`。

接下来,在项目目录中创建一个名为`images/`的新文件夹,并添加一个名为`gallery.html`的文件:

1 2 3 4<html lang="en"> 5<head> 6 7 8</head> 9 10

11 Home 12 Emoji 13 14

Image gallery

15 16</html>


一会儿你会给`gallery.html`添加一些图片但是首先看一下第 11 行和第 12 在那里你链接到你的其他页面

因为`index.html``emoji.html``gallery.html`上面的一个文件夹所以必须在链接目标的前面加上两个点(`..`和一个斜线(`/`)

为了更方便地访问您还可以在`index.html`的导航菜单中添加您的图库链接:

<html lang="en"> <head> </head> Emoji Gallery ```py

您也可以在emoji.html中链接到您的图库:

<!-- emoji.html -->

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>My favorite emoji</title>
</head>
<body>
<nav>
    <a href="index.html">Home</a>
 <a href="images/gallery.html">Gallery</a> </nav>
<!-- ... -->
```py

如果你添加一个链接到一个 HTML 页面,那么你必须考虑从你现在所在的文件导航到那里。`gallery.html`文件是`index.html`下一个目录中的一个名为`images/`的文件夹。所以当你链接到`gallery.html`时,你需要在链接中包含子文件夹,你已经在上面做了。

相对链接对于链接你网站的页面很有用。当你想添加外部链接时,你可以使用**绝对链接**:

Links

My favorite websites are:

```py

你不是链接到 HTML 文件,而是链接到你最喜欢的网站列表中的绝对网址。这些链接与你在浏览器地址栏中输入的链接相同。

跳到浏览器,使用您刚刚添加的链接浏览您的网站:

https://player.vimeo.com/video/740468915?background=1

链接不仅仅是连接网站页面的便利工具,它们还是互联网基础设施的重要组成部分。如果你想了解更多关于链接的知识,那么看看这个 HTML 锚教程

网络的另一个重要元素是图像。如果没有分享假期照片和猫咪 gif 的能力,互联网将会变得索然无味。

您使用包含一个src属性的<img>元素将图像附加到您的 HTML 文档中。就像链接中的href一样,你在src中引用图像源。此外,您应该始终使用alt属性来添加描述图像的可选文本。这样,使用屏幕阅读器的人就可以访问您的网站。

更新gallery.html并链接到三个图像:

<!-- images/gallery.html -->

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>Image Gallery</title>
</head>
<body>
<nav>
    <a href="../index.html">Home</a>
    <a href="../emoji.html">Emoji</a>
</nav>
<h1>Image Gallery</h1>
<img src="sky_1.png" alt="Cloudy sky."> <img src="sky_2.png" alt="Sun shining through a cloudy sky."> <img src="sky_3.png" alt="Sky with almost no clouds."> </body>
</html>
```py

点击下面的代码下载材料后,您会在`images/`文件夹中找到天空图像:

**免费奖励:** [点击这里下载本教程](https://realpython.com/bonus/html-css-python-code/)的补充资料,包括一个省时的 HTML 模板文件。

如果您使用自己的图像,那么您需要相应地调整文件名。不要忘记也更新描述图片内容的`alt`文本到[使你的图片可访问](https://www.w3.org/WAI/tutoriaimg/)。

`alt`文本大致相当于 Python 中的[文档字符串。docstring 可以描述对象的用途,而`alt`文本描述图像的内容。就像 docstring 一样,`alt`文本应该以点(`.`)结尾。](https://realpython.com/documenting-python-code/#documenting-your-python-code-base-using-docstrings)

给你的图片添加额外的信息是额外的工作,但是值得一做。如果照片里有一只可爱的狗,每个人都应该知道照片里有一只可爱的狗。如果你需要任何令人信服的东西,请前往 axess 实验室的 [Alt-texts:终极指南](https://axesslab.com/alt-texts/)。

当你在浏览器中打开`gallery.html`时,你的页面应该看起来像这样:

[![Screenshot of an image gallery with default browser styling.](img/e4a7b5112361962329d9f1d868ccea5f.png)](https://files.realpython.com/media/06-gallery-no-styling.e19041073914.png)

图片是让你的网站更具视觉吸引力的好方法。然而,图片库有点杂乱无章,没有任何额外的样式,网站看起来相当老派。是时候改变这种状况了!

在下一节中,您将向 HTML 添加样式规则,并更好地控制网站元素的外观。

[*Remove ads*](/account/join/)

## 用 CSS 设计你的内容

当您在浏览器中打开一个普通的 HTML 文件时,默认情况下浏览器会添加一些样式。这就是为什么您能够区分上一节中的元素,尽管您自己没有添加任何样式。

这基本上是一种从浏览器到人类的服务。但是严格来说,你写 HTML 的时候,只是定义了你网站的标记。纯 HTML 不为页面上的元素提供任何样式。要设计元素的样式,您需要添加 CSS。

CSS 代表**级联样式表**。稍后您将看到,您可以组合和嵌套您的 CSS 样式规则,因此命名为*级联*样式表。

就像 HTML 一样,它是互联网的基石技术。它可以帮助你将网站的外观与实际内容区分开来:

> 除了具有良好的语义和吸引人的布局之外,您的内容应该在其源代码顺序中具有逻辑意义——您可以在以后使用 CSS 将其放置在您想要的位置,但是您应该从源代码顺序开始,这样屏幕阅读器用户向他们读出的内容才会有意义。([来源](https://developer.mozilla.org/en-US/docs/Learn/Accessibility/HTML#page_layouts))

在这一节中,你将学习如何通过添加 CSS 来控制你的网站的样式。

### 为你的网站增添色彩

到目前为止,你只使用了浏览器来*加载*你的 HTML 文件。但是网络浏览器是强大的工具,当你开发一个网站时,它们能给你极大的帮助。

您可以使用浏览器的[开发者工具窗格调查任何网站。尤其是当您使用 CSS 时,浏览器的开发工具会派上用场:](https://developer.mozilla.org/en-US/docs/Learn/Common_questions/What_are_browser_developer_tools)

[https://player.vimeo.com/video/740478263?background=1](https://player.vimeo.com/video/740478263?background=1)

请注意,您的开发人员工具中的更改不会持续。当您重新加载页面时,所有更改都将消失。因此,一旦您对样式调整感到满意,就需要将代码复制并粘贴到 HTML 文件的`<style>`标签中。

打开`index.html`,在`<head>`中添加`<style>`元素:

<html lang="en"> <head> </head> </html> ```py

使用<style>元素,您可以将 CSS 代码添加到 HTML 文档中。尽管浏览器对此并不严格,但你应该只将<style>元素放在<head>中。否则,浏览器可能会试图在应用任何 CSS 规则之前呈现元素,这可能会导致无样式内容的闪现。

<style>的内容不是 HTML 代码,而是 CSS。使用 CSS您可以定义如何在页面上设置元素样式的规则。

选择器,你定义你想要的目标元素,然后是声明块。在上面的 CSS 代码中,使用了类型选择器来定位<body>和所有<a>元素。在本教程的后面,您将使用一些其他类型的 CSS 选择器。如果你想学习更多关于 CSS 选择器的知识,那么去 Mozilla 的 CSS 选择器页面。

声明块由左大括号({)和右大括号(})分隔。用分号(;)分隔块内的声明。宣言本身由两部分组成:

  1. **属性:**定义特征的标识符
  2. **值:**应该如何处理特征的描述

属性和值由冒号(:)分隔。在上面的例子中,通过指定的 RGB 值,你将<body>的背景色改为深蓝色,文本改为非常浅的灰色。在第二个 CSS 规则集中,你用现代的鲑鱼色调给所有的链接着色。

颜色是控制网站外观和感觉的重要部分。在 CSS 中,你有多种方式来描述颜色。你可以看看 Smashing 杂志的现代 CSS 颜色指南来扩展你关于 CSS 中颜色使用的知识。

**注意:**有超过一个上百种不同的属性可以使用,并且有大量的值可以分配给它们。但是就像 Python 一样,你写的 CSS 越多,你就越了解它的功能、特点和一般语法。

除了颜色的选择,你还可以用字体改变网站的外观。您已经更改了文本的颜色。接下来,用font-size属性调整body的文本大小:

<!-- index. html -->

<!-- ... -->
<style> body  { background-color:  rgb(20,  40,  60); color:  rgb(240,  248,  255); font-size:  1.3em;   } a  { color:  rgb(255,  111,  111); } </style>
<!-- ... -->
```py

使用`font-size: 1.3em;`,您告诉浏览器显示比父元素字体大`1.3`倍的文本。`<body>`的父元素是`<html>`,所以在浏览器中显示的文本会比默认字体大`1.3`倍。默认的字体大小通常是 16 像素,所以文本将以大约 21 像素的大小显示。

你可以直接用像素来定义字体大小。然而,通常使用百分比或`em`来表示文本大小:

> em 单位以字母“M”命名在印刷术中有着悠久的传统它被用来测量水平宽度。([来源](https://www.w3.org/Style/LieBos3e/em))

当你不得不把 T2 字母铸进金属块时,字母 M 通常占据了铸块的整个水平宽度。在 CSS 中,您也可以使用`em`来表示垂直长度,这是创建可伸缩设计的好单位。这意味着你的用户可以在不破坏设计的情况下放大你的网站。当用户希望增加字体大小以更好地阅读您的内容时,或者当他们从移动设备访问您的网站时,这一点非常重要。

像素和`em`只是 CSS 中可以使用的[多种长度单位中的两种。当你开始专注于设计你的网站时,看看这些单元并尝试不同类型的单元是值得的。](https://www.w3.org/Style/Examples/007/units.en.html)

除了文本的大小,显示文本的字体是另一个对网站设计有巨大影响的因素。

[*Remove ads*](/account/join/)

### 改变字体

字体是改变文档字符的绝佳工具。在网站上使用字体时,您有两种选择:

1.  依靠你的访问者在他们的系统上安装的字体。
2.  从您的服务器或外部资源加载自定义 web 字体。

无论哪种选择,定义一个**字体堆栈**都是一个好主意。当您为`font-family`列出多种字体时,浏览器会尝试从左至右加载字体:


当你如上所示声明一个字体堆栈时浏览器首先尝试加载 [Helvetica 字体](https://en.wikipedia.org/wiki/Helvetica)如果浏览器在字体堆栈中找不到字体它会继续加载下一个**备用字体**在这种情况下如果 Helvetica  Arial 都不存在浏览器将加载任何 T4 无衬线字体

为你的项目选择合适的字体是让你的内容易于理解的良好开端但是请记住除了字体之外还有其他因素会影响文本的易读性你可以通过调整字体大小行高和颜色来改变[网页排版](https://www.toptal.com/designers/typography/web-typography-infographic)的外观和感觉你的文本可读性越强每个人就越容易理解

注意:你可以按照你喜欢的任何方式对你的 CSS 属性进行排序从长远来看字母顺序更易于维护而按功能对属性进行分组可能更易于编写一些 CSS 开发人员甚至按照长度对他们的 CSS 属性[进行排序](https://css-tricks.com/poll-results-how-do-you-order-your-css-properties/)

在浏览器中打开`index.html`,看看显示的是哪种字体:

[![Screenshot of an HTML page with styling.](img/76e8cac7b10e9b3cff377cb43a3d3bb5.png)](https://files.realpython.com/media/07-index-first-styling.12974b80bb2a.png)

您可以使用浏览器的开发工具[调查加载了哪种字体](https://developer.chrome.com/blog/devtools-answers-what-font-is-that/)如果不是 Helvetica 或阿里亚呢跳到下面的评论让真正的 Python 社区知道你的系统加载的是哪种字体

如果你想对显示的字体有更多的控制那么你需要加载自定义的网络字体如何在 CSS 中使用@ font-face 是在你的网站上实现自定义网页字体的一个很好的指南

使用你添加到 HTML 中的 CSS你只是在设计你的网站 CSS 来设计你的内容几乎有无数种方式如果你想深入了解那么你可以查看 Mozilla  CSS 参考资料

### 分开你的顾虑

`<style>`元素的帮助下您将前一节中的 CSS 代码直接添加到了`index.html`如果你想以同样的方式设计`emoji.html`那么你需要复制并粘贴代码

作为 Python 开发人员您知道复制和粘贴代码不是最好的主意您最终会在两个地方得到相同的代码这使得更新代码变得很麻烦

在你的 Python 代码中你可以[导入模块](https://realpython.com/python-modules-packages/)以防止重复HTML 提供了类似的功能来将外部资源加载到 HTML 代码中这允许你加载一个外部 CSS 文件并从你的 HTML 文件中引用这个**样式表**

`index.html``emoji.html`旁边创建一个名为`style.css`的新文件然后`index.html``<style>`的内容剪切下来粘贴到`style.css`:

1/* style.css */ 2 3body { 4 background-color: rgb(20, 40, 60); 5 color: rgb(240, 248, 255); 6 font-family: "Helvetica", "Arial", sans-serif; 7 font-size: 1.3em; 8} 9 10a { 11 color: rgb(255, 111, 111); 12}


请注意您的 CSS 文件只包含 CSS 声明 CSS 文件中您不需要在`index.html`中用来包装 CSS 代码的`<style>`标签

另外注意第 1 行中 **CSS 注释**的语法后跟星号(`/*`)的正斜杠表示注释的开始你可以在多行中分发一个 [CSS 注释](https://developer.mozilla.org/en-US/docs/Web/CSS/Comments)用另一个星号加上一个正斜杠(`*/`)来结束注释

现在你可以在你的`index.html`文件的头中引用`style.css`:

<html lang="en"> <head> </head>

`<link>`元素类似于锚标记(`<a>`)它还包含一个定义链接的`href`属性然而它是一个只包含属性的空元素不会呈现一个可点击的超链接

`stylesheet`链接也添加到`emoji.html`:

<html lang="en"> <head> </head>

为了反映`gallery.html`中的变化`style.css`添加相对链接:

1 2 3 4<html lang="en"> 5<head> 6 7 8 9</head> 10 11


记住`style.css``gallery.html`上面的一个目录在你的`images/`目录里所以不要只是链接到`style.css`你必须链接到`../style.css`。

一旦更新了 CSS 引用请在浏览器中查看您的页面:

[https://player.vimeo.com/video/740468952?background=1](https://player.vimeo.com/video/740468952?background=1)

现在您所有的页面都共享相同的样式当您在`style.css`中更改 CSS 代码时您可以看到所有页面上出现的更改

作为一名 Python web 开发人员您可能需要在 web 项目中自己编写一点 HTML然而对于 CSS 来说使用外部的 **CSS 框架**来照顾你的设计是相当常见的

CSS 框架为你提供了现成的 CSS 代码为了充分发挥 CSS 框架的优势您可能需要调整 HTML 代码以符合其规则集但是一旦你习惯了 CSS 框架从长远来看它可以省去你显式设计 HTML 元素的工作

最流行的 CSS 框架之一是 [Bootstrap](https://getbootstrap.com) 你还会遇到 [Simple.css](https://simplecss.org) [布尔玛](https://bulma.io)包括在真正的 Python 教程中[管理你的待办事项列表](https://realpython.com/django-todo-lists/)[创建抽认卡应用](https://realpython.com/django-flashcards-app/)

**注意:**如果你想从头开始你的 CSS 设计你也可以加载一个外部的**重置样式表**通过在加载你的样式之前添加一个[重置样式表](https://en.wikipedia.org/wiki/Reset_style_sheet)你重置了浏览器的所有默认样式这使您可以完全控制页面上任何 HTML 元素的样式

您可以添加外部的非本地 CSS 样式表就像您的带有`<link>`元素的本地样式表一样如果你在网站上引用了不止一个样式表顺序很重要稍后您将研究这种行为

首先继续向 HTML 页面添加另一个样式表链接下面是`index.html`的示例代码:

<html lang="en"> <head> </head>

正如 CSS 中的 C 所暗示的你也可以层叠样式表当您在浏览器中打开`index.html`您可以看到设计已经改变:

[![Screenshot of an HTML page with local and external CSS.](img/a606268dccd319c136df0b25c39cb077.png)](https://files.realpython.com/media/09-external-css.a2eac66b17bd.png)

您组合了本地`style.css`和外部`simple.css`的样式规则尝试加载外部样式表的顺序当你重新加载你的页面时你会发现你的网站外观发生了变化

类似于在 Python 中覆盖变量CSS 属性互相覆盖一般来说应用于元素的最后一个值胜出

在本节中您了解到可以使用外部样式表来代替`<style>`元素甚至还有第三种方法将 CSS 规则添加到 HTML 您可以使用一个`style` HTML 属性来直接设计 HTML 元素的样式这被称为**内联 CSS 样式**

**注意:**内联 CSS 样式有它的用例但是当你开始学习 HTML  CSS 的时候尽量不要使用它一般来说添加[内联 CSS 被认为是不好的做法](https://stackoverflow.com/questions/2612483/whats-so-bad-about-in-line-css)

更加明确地将 CSS 声明与特定的 HTML 元素连接起来可以让您获得完善设计所需的控制在下一节中您将学习如何使用 CSS 类更灵活地设计元素的样式

[*Remove ads*](/account/join/)

### 使用类以获得更大的灵活性

到目前为止您设置的 CSS 规则只针对一般的 HTML 元素但是当您为 HTML 属性设置规则时您可以更具体地使用 CSS 代码

 HTML 元素添加一个`class`属性可以让你使用 **CSS 类选择器**根据元素的类值来设计元素的样式

CSS 类的一个基本特征是它们允许你将公共元素分组并一次性对所有元素应用一组规则然后在保持风格一致的同时潜在地更新它们

例如您可以定义一个将圆角应用于图像的类但是您可以只为那些应该有圆角的图像分配一个类而不是使用`img`名称来定位所有的图像元素这为您提供了一个额外的优势即可以通过给其他元素添加相同的类来给它们添加圆角

要了解 CSS 类选择器是如何工作的调整`gallery.html`中的代码使其看起来像这样:

1 2 3 4<head> 5 6 7 8 9</head> 10 11 12 13

Image Gallery

14
15 Cloudy sky. 16 Sun shining through a cloudy sky. 17 Sky with almost no clouds. 18
19


首先记得添加一个到外部样式表的链接不要忘记在前面添加两个点来链接到`../style.css`因为样式表在`gallery.html`之上一个文件夹

然后`<img>`元素包装在`<div>`块中。`<div>`元素是构建页面的通用元素它不包含任何语义只有当没有其他 HTML 标签更适合使用时才应该使用它

您还可以向 HTML 元素添加`class`属性在第 14 您甚至在一个空格分隔的列表中链接类这意味着您将两个 CSS 类应用于`<div>`元素相比之下 15  17 行中的`<img>`元素只包含一个 CSS 

要创建类请转到`style.css`并添加以下 CSS 代码:

1/* style.css / 2 3/ ... */ 4 5.gallery { 6 background: rgba(255, 255, 255, 0.2); 7 padding: 1em; 8} 9 10.rounded { 11 border-radius: 15px; 12} 13 14.gallery img { 15 margin-right: 0.2em; 16 width: 150px; 17}


你在 HTML `class`属性中引用 CSS 不带点(`.`)然而在你的 CSS 代码中你必须在一个选择器的开头添加一个点来指定你的目标是`class`属性如果你想阅读更多关于 CSS 选择器的内容那么去 Mozilla  [CSS 选择器](https://developer.mozilla.org/en-US/docs/Learn/CSS/Building_blocks/Selectors)文档

在第 6 行和第 7 行中您为`.gallery`设置了规则比如一个部分透明的背景和一个`1em`填充来增加 gallery 元素内部所有边的空间

使用`.rounded`选择器给所有包含这个类的 HTML 元素一个半径为 15 像素的圆角

您甚至可以像在第 14 行那样链接您的 CSS 选择器使用空格分隔的选择器列表`.gallery img`您为带有类`gallery` HTML 元素中的所有`img`元素添加了一个规则通过第 15 行和第 16 行的 CSS 声明使用`margin-right`在右侧给它们留出一些空间并使图库图像为 150 像素宽

使用`padding`、`margin``border`属性您可以定义 CSS 元素的间距你可以把这些元素想象成盒子它们周围有一定的空间里面有存储内容的空间这个概念被称为**箱式模型**:

> CSS 中的每样东西都有一个方框理解这些方框是用 CSS 创建更复杂布局的关键也是将项目与其他项目对齐的关键([来源](https://developer.mozilla.org/en-US/docs/Learn/CSS/Building_blocks/The_box_model))

如果你想更深入地研究 CSS那么学习盒子模型是关键你可以跟随 Mozilla [学习如何使用 CSS](https://developer.mozilla.org/en-US/docs/Learn/CSS) 来设计 HTML 的风格以便更好地理解 CSS 包含的所有构件

您可以从这里出发探索 HTML  CSS 提供的标记和设计世界但是特别是对于 HTML你很快就会注意到它是一种非常冗长的语言而且手写起来很麻烦这是您作为 Python 开发人员可以大放异彩的地方

在下一节中您将了解 Python 如何帮助您更有效地处理 HTML 文件

[*Remove ads*](/account/join/)

## 用 Python 处理 HTML】

作为一名 Python 开发人员您知道 Python 是一个很好的工具可以将原本需要手工完成的任务自动化尤其是在处理大型 HTML 文件时Python 的强大功能可以帮您节省一些工作

### 以编程方式编写 HTML

有了所有的开始和结束标签HTML 可能很难写幸运的是Python 非常适合帮助您以编程方式创建大型 HTML 文件

在这一部分您将扩展`emoji.html`来显示更多关于您最喜欢的表情符号的信息用表格替换有序列表:

1 2 3 4

My favorite emoji

5

I don't just like emoji,
6I love emoji!

7

Here's a table of my most-used emoji:

8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
#EmojiName
1.🐞Lady Beetle
2.🐍Snake
3.👍Thumbs Up Sign
35


您用`<table>`元素定义一个 HTML 表格`<tr>`定义表格行就像电子表格中的表格一样HTML 表格可以有表头和表体虽然使用`<thead>``<tbody>`并不是表格工作的必要条件但是将它们添加到表格标记中是一个很好的做法

在表头中通过向第一行添加三个`<th>`元素来定义三个表列

表体包含相同数量的列和一行或多行对于表格数据单元格使用与表格标题中相同的`<td>`元素

表情符号表列出了你最喜欢的三个表情符号及其 Unicode 描述当然没有人只有三个最喜欢的表情符号

即使只有 12 个最喜欢的表情符号手动创建 HTML 表格也很烦人所以你把 Python 加入到这个组合中

在项目目录中创建一个名为`emoji_table.py`的新 Python 文件 Python 为您完成这项工作:

emoji_table.py

import unicodedata

all_emoji = "🐞🐍👍🎉🤩😂🐶🍿😎💬😘" columns = ["#", "Emoji", "Name"]

table_head = f"\n{''.join(columns)}\n"

table_body = "\n\n" for i, emoji in enumerate(all_emoji, start=1): emoji_data = [f"{i}.", emoji, unicodedata.name(emoji).title()] table_body += f"{''.join(emoji_data)}\n" table_body += "\n"

print(f"\n{table_head}{table_body}

")


借助内置的 [`unicodedata`](https://docs.python.org/3/library/unicodedata.html#module-unicodedata) 模块和 [`enumerate()`](https://realpython.com/python-enumerate/) Python 可以通过编程的方式为你构建一个表情表。

**注意:**字符串中的换行符(`\n`)是可选的浏览器会忽略任何多于一个空格的空白但是使用`\n`会让你的 HTML 代码更漂亮一点

在您的终端中运行`emoji_table.py`复制 HTML 代码并将其粘贴到`emoji.html`:

1 2 3 4

My favorite emoji

5

I don't just like emoji,
6I love emoji!

7

Here's a table of my most-used emoji:

8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
#EmojiName
1.🐞Lady Beetle
2.🐍Snake
3.👍Thumbs Up Sign
4.🎉Party Popper
5.🤩Grinning Face With Star Eyes
6.😂Face With Tears Of Joy
7.🐶Dog Face
8.🍿Popcorn
9.😎Smiling Face With Sunglasses
10.Sparkles
11.💬Speech Balloon
12.😘Face Throwing A Kiss
28


有了`emoji_table.py`你现在可以扩展你的 HTML 表情表来包含所有你喜欢的表情

如果您想让您的表格看起来更好一点那么您可以使用`style.css`中的 [`:nth-child()`伪类](https://developer.mozilla.org/en-US/docs/Web/CSS/:nth-child)添加额外的样式:

/* style.css / / ... */ th, tr:nth-child(even) { background-color: rgba(255, 255, 255, 0.2); } td:nth-child(1) { text-align: right; } td:nth-child(2) { text-align: center; }


HTML 表格是在你的网站上组织表格数据的好方法你可以查看 Mozilla 关于 HTML 表格和[样式表格](https://developer.mozilla.org/en-US/docs/Learn/HTML/Tables)的文档了解更多关于使用 HTML 表格的信息

虽然`emoji_table.py`可以帮助你构建更大的表但这仍然是一个复杂的过程目前您需要将终端输出复制到 HTML 文件中那不理想

但是现在是时候探索 Python 可以帮助您处理 HTML 代码的其他方法了

[*Remove ads*](/account/join/)

### 用 Python 创建 HTML 实体

HTML 附带了一个很大的[命名字符引用列表](https://html.spec.whatwg.org/multipage/named-characters.html#named-character-references),你可以用它在 HTML 中编码你的文本。因此,举例来说,你可以把欧元符号写成 **HTML 实体** `&euro;`而不是 **UTF-8** `€`字符。

在过去像这样对字符进行编码很重要因为没有办法直接输入它们随着 [UTF-8 字符编码](https://en.wikipedia.org/wiki/UTF-8)的出现你可以使用真正的 UTF-8 字符来代替大多数时候这甚至被推荐因为它更具可读性

尽管如此有些情况下 HTML 编码是更好的选择根据经验当字符出现以下情况时可以使用 HTML 实体:

*   视觉上无法区分
*   干扰 HTML 语法

以空白字符为例Unicode 字符数据库中列出了 25 个空白字符有些看起来一模一样像正规空格()[非断空格](https://en.wikipedia.org/wiki/Non-breaking_space) ( )视觉上空间是不可区分的但是当你看一下这个页面的源代码你会发现后者被转义为它的 HTML 实体`&nbsp;`:

[![Screenshot of source code in browser dev tools.](img/6d8146dfa08f02ac07b489576f761275.png)](https://files.realpython.com/media/12-nbsp.64c38a7ec439.png)

如果要在 HTML 文档上显示 HTML 标签还需要对像开尖括号(`<`)和闭尖括号(`>`)这样的字符进行转义同样看看本教程的源代码注意尖括号是如何转义的:

[![Screenshot of source code in browser dev tools.](img/121a923904fed7b3982c4576c74ee2f5.png)](https://files.realpython.com/media/13-angle-brackets.56f9b437fc93.png)

左尖括号转义为`&lt;`。右尖括号转义为`&gt;`。

要查看 HTML 实体的完整列表您可以利用 Python 内置的 [`html`](https://docs.python.org/3.10/library/html.html) 模块:

>>>

import html html.entities.html5 {'Aacute': 'Á', 'aacute': 'á', 'Aacute;': 'Á', 'aacute;': 'á', ... 'zscr;': '𝓏', 'zwj;': '\u200d', 'zwnj;': '\u200c'}


`html``entities`模块定义了四个字典其中之一是`html5`它将 HTML 命名的字符引用映射到对应的 Unicode 字符

`html.entities.codepoint2name`你可以找到一个字符的 HTML 实体名:

>>>

import html code_point = ord("€") code_point 8364

html.entities.codepoint2name[cp] 'euro'


欧元(`€`)的代码点是`8364`。对于`8364``codepoint2name`字典返回`'euro'`。要在 HTML 代码中使用这个名称必须在名称前加一个&符号(`&`)并在名称后加一个分号(`;`)以获得有效的`&euro;` HTML 实体

您可以让 Python 来帮助您而不是自己记忆和编写 HTML 实体Python `html`模块还附带了一个解析器当您想要解析 HTML 文档时这个解析器非常方便

### 用 Python 解析 HTML】

当您需要从 HTML 文件中读取数据时Python 也可以使用内置的`html`模块来帮助您在本节中您将使用`html.parser`构建一个原始的 HTML **解析器**您将要编写的脚本将引用您在本教程前面创建的`gallery.html`文件您可以[重温教程的那一部分](#links-images-and-tables)或者点击下面的链接下载所有文件:

**免费奖励:** [点击这里下载本教程](https://realpython.com/bonus/html-css-python-code/)的补充资料包括一个省时的 HTML 模板文件

`gallery.html`旁边创建一个名为`parse_image_links.py`的新 Python 文件:

images/parse_image_links.py

from html.parser import HTMLParser

class ImageParser(HTMLParser): def handle_starttag(self, tag, attrs): for attr, val in attrs: if attr == "src" and tag == "img": print(f"Found Image: {val!r}")

with open("gallery.html", mode="r", encoding="utf-8") as html_file: html_content = html_file.read()

parser = ImageParser() parser.feed(html_content)


当您向 Python `HTMLParser`实例提供 HTML 数据时如果找到标记元素该实例将调用其处理程序方法在上面的例子中您创建了一个`HTMLParser`**子类**`gallery.html`的代码中寻找任何具有`src`属性的`<img>`元素

对于`gallery.html`文件输出如下所示:

Found Image: 'sky_1.png' Found Image: 'sky_2.png' Found Image: 'sky_3.png'


对于您的本地文件,您可以在您的编辑器中查找,这可能不是一个大问题。但是想象一下,如果您调整上面的脚本来从任何给定的 URL 读取代码,会有什么样的可能性!

如果 Python 的`html`模块激发了你的兴趣,那么阅读[Python](https://realpython.com/python-web-scraping-practical-introduction/)的网络抓取实用介绍是一个不错的下一步。对于一个更实际的方法,你也可以[用漂亮的汤](https://realpython.com/beautiful-soup-web-scraper-python/)建造一个网络刮刀。

在开始解析之前,先看看本教程最后一节中的其他步骤。

[*Remove ads*](/account/join/)

## 继续使用 Python 中的 HTML 和 CSS

你可以用基本的 HTML 和 CSS 完成很多事情。当您将 Python 这样的编程语言融入其中时,使用 HTML 和 CSS 会变得更加有趣。

在这一节中,您将对可以利用您的 HTML 和 CSS 知识的技术进行概述。

### JavaScript

正如你在本教程中学到的HTML 提供了一个网站的结构。使用 CSS您可以添加格式和布局。这是创建网站的一个很好的基础。

然而,如果不提到 JavaScript那么对 HTML 和 CSS 的介绍就不完整。JavaScript 是一种对现代网站至关重要的[解释编程语言](https://en.wikipedia.org/wiki/List_of_programming_languages_by_type#Interpreted_languages)。

使用 JavaScript您可以向 web 项目添加功能。例如,当用户与您的网站交互时,您可以动态更新 HTML 和 CSS。

对于任何想从事 web 开发的程序员来说,学习 JavaScript 都是一个不错的选择。要更深入地研究 JavaScript请前往 Mozilla 的 JavaScript 学习区。

如果你想从 Python 程序员的角度探索 JavaScript那么看看[Python vs JavaScript for Python istas](https://realpython.com/python-vs-javascript/)。

### 金贾

在本教程中,您将 HTML 标记存储在 [Python 字符串](https://realpython.com/python-strings/)中,以动态创建 HTML 代码。当您的 web 项目发展时HTML 和 Python 的混合会变得复杂。

为了分离关注点,使用**模板**是一个好主意。使用模板,您可以为大型网站创建构建块,而无需复制前端代码。这样,您可以将 HTML 标记保存在模板文件中,并用 Python 填充它们。Python 的首选**模板引擎**是 [Jinja](https://jinja.palletsprojects.com) 。

使用 Python 和 Jinja您可以动态创建 HTML 代码。但你不必就此止步。任何时候你想创建带有编程内容的文本文件Jinja 都可以帮你。

如果你想学习如何用 Jinja 构建丰富的模板,那么看看 Real Python 的关于 Jinja 模板化的[入门。](https://realpython.com/primer-on-jinja-templating/)

### 烧瓶

有了 HTML 和 CSS 的基础知识,你就可以构建你的第一个真正的 web 应用程序了。HTML 和 CSS 负责用户交互的前端。要从服务器加载内容,您需要某种后端。这就是 web 框架发挥作用的地方。

[Flask](https://flask.palletsprojects.com/) 是一个流行的 Python web 框架,非常适合从头开始构建 web 应用程序。在安装了带有 [`pip`](https://realpython.com/what-is-pip/) 的`flask`包之后,您就可以通过创建一个只有几行代码的 Python 文件来启动一个 Flask 项目。换句话说,你从小处着手,按照你自己的步调一步一步地增强你的项目。

您可以遵循 [Flask by Example](https://realpython.com/learning-paths/flask-by-example/) 学习路径,探索使用 Flask 微框架进行 Python web 开发的基础知识。

### 姜戈

Django 是另一个流行的 Python web 框架。与 Flask 相比,当您开始一个新的 Django 项目时Django 为您提供了一个项目结构。不用自己添加太多代码,你就可以马上使用[管理后端](https://realpython.com/customize-django-admin-python/)和[数据库](https://realpython.com/python-sql-libraries/)。Django 的强大功能可以让您在更大的 web 项目中领先一步,但是对于初学者来说,浏览所有的文件可能会有些力不从心。

幸运的是,你可以找到大量关于真正 Python 的 [Django 教程来指导你。你可以通过](https://realpython.com/tutorials/django/)[开发一个文件夹应用](https://realpython.com/get-started-with-django-1/)或者[开发一个个人日记网络应用](https://realpython.com/django-diary-project-python/)来开始使用 Django。如果你想建立一个更大的项目那么 [Django 社交网络系列](https://realpython.com/django-social-network-1/)非常适合你。

[*Remove ads*](/account/join/)

### PyScript

PyScript 是一个新的框架,允许你在网络浏览器中运行 Python。但是不要将其与 Flask 或 Django 等 web 框架混淆:

> PyScript 只是 HTML只是稍微强大一点(好吧,可能强大很多),这要归功于 Python 库的丰富且可访问的生态系统。([来源](https://pyscript.net))

如果你感兴趣,那么在 Web 浏览器中让[先看看 PyScript: Python。](https://realpython.com/pyscript-python-in-browser/)

## 结论

无论你选择哪种方式成为 Python web 开发人员HTML 和 CSS 都是不可避免的。这两种技术都是创建网站的基础。

在本教程中,您构建了一个样本 HTML 文档,为您即将开始的 web 项目提供了一个良好的开端。

**一路走来,你学会了如何:**

*   构建一个基本的 **HTML** 文件
*   显示**图片**和**链接**到页面
*   用 **CSS** 设计一个网站
*   考虑到**可访问性**来格式化 HTML
*   使用 Python 编写和解析 HTML 代码

Python、HTML 和 CSS 是一个强大的三重奏,使您能够创建小的 HTML 文档和大的 web 项目。但是,即使你的目标不是 web 开发人员,了解一两件关于 HTML 和 CSS 的事情也会帮助你更好地理解 Web。

**免费奖励:** [点击这里下载本教程](https://realpython.com/bonus/html-css-python-code/)的补充资料,包括一个省时的 HTML 模板文件。**********