者 | 單雨
責編 | 胡巍巍
出品 | CSDN(ID:CSDNnews)
前言
為了實現模板封裝和復用,提高HTML界面調試便捷性以及前后端解耦等目標,Django定義了自己的網絡模板語言。
當前介紹模板語言的官方文檔已經非常完備,幾乎涵蓋了開發中需要用到的知識點和需要注意的問題,但同時官方文檔也存在一些問題:
翻譯不夠完善,帶來閱讀的困難;
一些知識點的介紹過于簡短,存在大量的頁內鏈接,閱讀時需要跳轉到不同的頁面,閱讀不連貫。
本文基于官方文檔系統介紹了Django模板語言的基礎知識點,方便快速了解Django模板語言。
模板系統設計哲學
Django的模板系統不是簡單的把Python嵌入到HTML中。
它的設計宗旨是:模板系統旨在展示內容, 而不是程序邏輯,因此不在HTML頁面中嵌入Python。
簡單的說,模板只負責渲染數據,大多數邏輯應該交給視圖(view)進行處理。
模板簡介
模板是一個簡單的文本文件。它可以生成任何基于文本的格式(如 HTML,XML,CSV等)。除了基本的HTML標簽外,模板還包含兩種額外的元素——變量和標簽。
模板中包含的變量可以被替換為變量的值,標簽則被替換為相應的模板控制邏輯。示例:
django
{% extends "base_generic.html" %}
{% block title %}{{ section.title }}{% endblock %}
{% block content %}
<h1>{{ section.title }}</h1>
{% for story in story_list %}
<h2>
<a href="{{ story.get_absolute_url }}">
{{ story.headline|upper }}
</a>
</h2>
<p>{{ story.tease|truncatewords:"100" }}</p>
{% endfor %}
{% endblock %}
`{{ section.title }}`在模板渲染時將會被變量的值替換,for標簽可以實現模板的循環渲染。
基礎語法
變量
變量實現從模板上下文字典(返回HTTP響應時傳遞過來的字典)中輸出一個值,這是一個類似于dict的對象,包含鍵值對。當模板引擎遇到一個變量時,它會計算該變量,并用結果替換它。
變量名由字母、數字字符和下劃線("_")組成,但不能以下劃線開頭。點(".")也出現在變量中,代表屬性調用,變量名中不能有空格或標點符號。
示例:
django
My first name is {{ first_name }}. My last name is {{ last_name }}.
當傳入一個上下文字典`{'first_name': 'John', 'last_name': 'Doe'}`時,將會渲染得到:
django
My first name is John. My last name is Doe.
模板中的變量被字典中的值替換了。
變量還可以使用點表示法實現字典查找、屬性查找和列表索引查找等操作:
django
{{ my_dict.key }}
{{ my_object.attribute }}
{{ my_list.0 }}
點表示法底層原理
當模板系統遇到一個點,它會按順序嘗試下面的動作:
1. 字典查詢
2. 屬性或方法查找
3. 數字索引查詢
如果結果值是可調用的,則調用該值時將不帶參數,調用的結果成為新的模板值。
當進行能覆蓋字典查找的操作時,這種查找順序可能會造成一些意想不到的行為。例如:如果試圖循環一個collection .defaultdict字典對象:
django
{% for k, v in defaultdict.items %}
{其他操作}
{% endfor %}
因為字典查找是首先發生的,所以這個行為會先提供一個默認值,而不是使用預期的.items方法。在這種情況下,應該首先考慮使用字典查找,而不是使用字典的屬性調用。
注意
屬性通常被解釋為一個文本字符串,防止和同名的變量沖突。例如{{foo.bar}}中的屬性“bar”將被解釋為一個文本字符串,如果模板上下文中存在變量“bar”,則不會使用該變量的值。
以下劃線開頭的變量屬性可能不能訪問,因為它們通常被認為是私有的。
如果引用不存在的變量,模板系統將插入string_if_invalid選項的值,該選項默認設置為“”(空字符串)。
標簽
標簽在模板渲染過程中提供任意邏輯。標簽可以輸出內容,作為控制結構,例如“if”語句或“for”循環,從數據庫獲取內容,甚至允許訪問其他模板標簽。
(1)標簽聲明
標簽的一般形式為:
django
{% tag %}
示例:
django
{% csrf_token %}
(2)傳入參數
django
{% cycle 'odd' 'even' %}
(3)成對使用的標簽
有些標簽需要開始和結束標簽:
django
{% if user.is_authenticated %}Hello, {{ user.username }}.{% endif %}
(4)常用標簽
for:循環數組中的每個元素. 比如, 顯示列表 `athlete_list` 中每個元素的 `name` 屬性。
django
<ul>
{% for athlete in athlete_list %}
<li>{{ athlete.name }}</li>
{% endfor %}
</ul>
if 、elif和else:在上面,如果athlete_list不為空,則{{athlete_list|length}}變量將顯示運動員的數量。
否則,如果athlete_in_locker_room_list不為空,則會顯示“Athletes should be out…”消息。如果兩個列表都為空,則顯示“No athletes”。
也可以在if標簽里使用過濾器和各種操作符:
django
{% if athlete_list|length > 1 %}
Team: {% for athlete in athlete_list %} ... {% endfor %}
{% else %}
Athlete: {{ athlete_list.0.name }}
{% endif %}
注意
雖然上面的示例可以工作,但是要注意,大多數模板過濾器都返回字符串,因此使用過濾器進行數學比較通常不會正常工作,而長度是個例外。
(5)更多
Django有很多內置標簽,更多關于內置標簽的信息請參考官方文檔:
https://docs.djangoproject.com/zh-hans/2.2/ref/templates/builtins/ref-templates-builtins-tags
如果需要編寫自定義標簽,請參考官方文檔
https://docs.djangoproject.com/zh-hans/2.2/howto/custom-template-tags/howto-writing-custom-template-tags
如果需要對使用的標簽和自定義的標簽做一份說明文檔,可以使用Django提供的文檔工具,詳情請參考:
https://docs.djangoproject.com/zh-hans/2.2/ref/contrib/admin/admindocs/
過濾器
簡介
過濾器可以對變量做一些操作,例如給變量賦值,改變變量的值等。
修改變量顯示
過濾器可以修改變量的顯示。例如:
django
{{ name|lower }}
通過過濾器lower變量{{ name }}變為了小寫字符,通過管道符(|)間隔變量和過濾器來使用過濾器。
鏈式調用過濾器
一個過濾器的輸出可以作為下一個過濾器的輸入。
{{ text|escape|linebreaks }}是一種常用的轉換方式, 在這之后換行符被替換為了 <p> 標簽。
轉換變量和標簽參數
過濾器轉換變量和標簽參數的值。示例:
django
{{ django|title }}
傳入`{'django': 'the web framework for perfecalist With deadline '}`上下文字典時,該模板呈現為:
django
The Web Framework For Perfectionists With Deadlines
傳入參數給過濾器
示例1:
django
{{ my_date|date:"Y-m-d" }}
my_date將會被替換為當前日期。
示例2:
django
{{ bio|truncatewords:30 }}
將會會顯示 `bio` 變量的前30個字符
注意
過濾器參數中如果包含空格和標點符號,必須使用引號“”括起來,例如,要用逗號和空格連接列表,可以使用{{list|join:", "}}。
Django提供了大約60個內置模板過濾器,請參考官方文檔:
https://docs.djangoproject.com/zh-hans/2.2/ref/templates/builtins/ref-templates-builtins-filters,
下面列舉一些常用的過濾器:
default
如果變量為false或空,則使用給定的默認值。否則,使用變量的值。例如:
django
{{ value|default:"nothing" }}
如果 `value` 沒有提供或者為空,那么將它顯示為 "`nothing`" 。
length
返回值的長度。這對字符串和列表都適用。例如:
django
{{ value|length }}
如果 `value` 為 `['a', 'b', 'c', 'd']`, 那么他將被顯示為 `4`。
filesizeformat
將值格式化為“人類可讀的”文件大小(即“13kb”、“4.1 MB”、“102字節”等)。例如:
django
{{ value|filesizeformat }}
如果值為123456789,則輸出為117.7 MB。
如果需要自定義過濾器,請參考請官方文檔:
https://docs.djangoproject.com/zh-hans/2.2/howto/custom-template-tags/
注釋
示例:
單行注釋
django
{ this won't be rendered }
多行注釋:{% comment %} 和{% endcomment %}
django
<p>Rendered text with {{ pub_date|date:"c" }}</p>
{% comment "Optional note" %}
<p>Commented out text with {{ create_date|date:"c" }}</p>
{% endcomment %}
注意:Comment標簽不能嵌套使用。
作者簡介:單雨,90后工科男,偽文藝青年。目前就讀于北京理工大學宇航系,喜歡研究AI,網絡爬蟲,微信小程序以及機器人,癡迷于Coding,睡前必擼碼。
【END】
家好,我是皮皮。
還是昨天的那個網絡爬蟲問題,大佬們,幫忙看看這個網絡爬蟲代碼怎么修改?那個粉絲說自己不熟悉pandas,用pandas做的爬蟲,雖然簡潔,但是自己不習慣,想要在他自己的代碼基礎上進行修改,獲取數據的代碼已經寫好了,就差存儲到csv中去了。
他的原始代碼如下:
import requests
from lxml import etree
import csv
import time
import pandas as pd
def gdpData(page):
url = f'https://www.hongheiku.com/category/gdjsgdp/page/{page}'
headers ={'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36'}
resp = requests.get(url,headers = headers)
# print(resp.text)
data(resp.text)
file = open('data.csv',mode='a',encoding='utf-8',newline='')
csv_write=csv.DictWriter(file,fieldnames=['排名','地區','GDP','年份'])
csv_write.writeheader()
def data(text):
e = etree.HTML(text)
lst = e.xpath('//*[@id="tablepress-48"]/tbody/tr[@class="even"]')
for l in lst:
no = l.xpath('./td[1]/center/span/text()')
name = l.xpath('./td[2]/a/center/text()')
team = l.xpath('./td[3]/center/text()')
year = l.xpath('./td[4]/center/text()')
data_dict = {
'排名':no,
'地區':name,
'GDP':team,
'年份':year
}
print(f'排名:{no} 地區:{name} GDP:{team} 年份:{year} ')
csv_write.writerow(data_dict)
file.close()
url = 'https://www.hongheiku.com/category/gdjsgdp'
headers ={'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36'}
resp = requests.get(url,headers = headers)
# print(resp.text)
data(resp.text)
e = etree.HTML(resp.text)
#//*[@id="tablepress-48"]/tbody/tr[192]/td[3]/center
count = e.xpath('//div[@class="pagination pagination-multi"][last()]/ul/li[last()]/span/text()')[0].split(' ')[1]
for index in range(int(count) - 1):
gdpData(index + 2)
這里粉絲給了一瓶冰紅茶的費用,一個熱心市民給了一份代碼,在他的代碼基礎上進行修改的,代碼如下:
import requests
from lxml import etree
import csv
import time
import pandas as pd
def gdpData(page):
url = f'https://www.hongheiku.com/category/gdjsgdp/page/{page}'
headers ={'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36'}
resp = requests.get(url,headers = headers)
# print(resp.text)
data(resp.text)
def data(text):
file = open('data.csv', mode='a', encoding='utf-8', newline='')
csv_write = csv.DictWriter(file, fieldnames=['排名', '地區', 'GDP', '年份'])
csv_write.writeheader()
e = etree.HTML(text)
lst = e.xpath('//*[@id="tablepress-48"]/tbody/tr[@class="even"]')
for l in lst:
no = ''.join(l.xpath('./td[1]/center/span/text()'))
name = ''.join(l.xpath('./td[2]/a/center/text()')[0])
team = ''.join(l.xpath('./td[3]/center/text()'))
year = ''.join(l.xpath('./td[4]/center/text()'))
data_dict = {
'排名':no,
'地區':name,
'GDP':team,
'年份':year
}
print(f'排名:{no} 地區:{name} GDP:{team} 年份:{year} ')
csv_write.writerow(data_dict)
file.close()
url = 'https://www.hongheiku.com/category/gdjsgdp'
headers ={'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36'}
resp = requests.get(url,headers = headers)
# print(resp.text)
data(resp.text)
e = etree.HTML(resp.text)
#//*[@id="tablepress-48"]/tbody/tr[192]/td[3]/center
count = e.xpath('//div[@class="pagination pagination-multi"][last()]/ul/li[last()]/span/text()')[0].split(' ')[1]
for index in range(int(count) - 1):
gdpData(index + 2)
代碼運行之后,數據就存儲到csv中去了。
順利地解決了粉絲的問題!
大家好,我是皮皮。這篇文章主要盤點了一個Python網絡爬蟲后數據存儲的問題,文中針對該問題,給出了具體的解析和代碼實現,幫助粉絲順利解決了問題。
最后感謝粉絲【藍桉】提問,感謝【熱心市民】給出的思路和代碼解析,感謝【eric】等人參與學習交流。
人可能會與您分享需要的PDF 文檔。要向文檔添加更多內容,您可能會發現需要向其中添加頁面。但即使只是編輯 PDF 文檔上的現有內容也可能非常困難。如何向 PDF 添加頁面?
通過您選擇使用的 PDF 頁面編輯器,可以更輕松地向 PDF 文檔添加頁面。在本文中,我們將介紹一些可以給PDF添加頁面的編輯器,并向您展示如何使用它們。
您想要向現有 PDF 文檔添加頁面的原因有很多,其中包括:
以下解決方案將幫助您在需要時給PDF 文檔添加頁面。
如果您正在尋找一種可以輕松向 PDF 文檔添加頁面的解決方案,那么UPDF - PDF 編輯器是您的最佳選擇。此PDF 編輯器是編輯 PDF 文檔的最佳方法之一,它最擅長的是允許您管理 PDF 上的頁面。這意味著您可以將頁面添加到文檔的幾乎任何部分。
我們將在本文的下一部分中了解此過程的工作原理。但在此之前,讓我們先看看 UPDF 的其他功能。
方法1:如何在 PDF 中添加空白頁?
如果您使用 UPDF 打印 PDF 文檔,您可以通過以下方式旋轉 PDF 頁面:
第1步:打開 PDF。
在主界面中,單擊“打開文件”按鈕,然后瀏覽要編輯的PDF文檔。
第2步:將空白頁插入 PDF。
在 UPDF 中打開文檔后,單擊左側的“組織頁面”選項卡。這將打開頁面管理界面。
方法2:如何從另一個文件將頁面插入 PDF?
有時您想將兩個PDF文件合并在一起,但又希望將第二個PDF文件放置在某個位置,那么您可以使用UPDF的插入選項來幫助您。您可以直接將另一個 PDF 文件插入到當前 PDF 文件中。
第1步:選擇“來自文件”選項
如果您想從另一個 PDF 文檔添加頁面,您應該單擊頁面來選擇要插入的位置?,F在單擊“插入”選項并選擇“來自文件”。
第 2步:插入另一個 PDF 文檔中的頁面。
然后,您可以瀏覽計算機查找要添加到當前文檔的 PDF。然后單擊“打開”按鈕。
PDF 文件將被插入到您選擇的位置。您可以重新排序、編輯、注釋或轉換 PDF 文件。
方法3:如何通過組合將頁面添加到PDF
UPDF 提供了另一種方法來幫助您將整個 PDF 插入到另一個 PDF 文件中。如果您想將兩個或多個 PDF 文件的所有頁面插入在一起,可以按照以下步驟操作:
步驟1:在UPDF的歡迎頁面上,您將看到有一個“批量”選項,點擊它。
步驟 2:該工具提供了許多批處理選項。根據需要選擇“組合”選項。
步驟 3:在新窗口中,您可以添加要插入的PDF文件并將它們組合在一起。單擊“應用”開始該過程。完成此過程后,您可以輕松地重新排列 PDF 文件中的頁面。
方法4:如何一次將頁面插入多個 PDF 文件?
如果想將一個 PDF 一次性插入到其他多個 PDF 文件中。UPDF 也可以幫助您。請按照以下說明操作:
步驟1:與方法3相同,請點擊“批量”>“插入”選項。
步驟2:在右側區域,您需要選擇要插入到多個PDF文件中的單個文件。您可以設置該文件的位置:在前面、在末尾或在哪一頁之后。
步驟 3:在左側區域,您需要添加多個PDF文件。
步驟4:點擊“應用”。
方法5:如何在Adob?e Reader中將頁面添加到PDF?
首先,您無法使用Adobe Reader向PDF添加頁面,因為Reader DC是免費版本,只能用于閱讀和注釋PDF文檔。
如果您想向 PDF 添加頁面,則必須升級到 Adob??e Acrobat Standard DC 或 Pro DC,這非常昂貴(每年 239.88 美元)。
升級到 Adob??e Acrobat Pro 后,您可以按照以下步驟操作:
步驟1:單擊“工具”選項并選擇“組織頁面”工具。
步驟2:打開您的 PDF 文檔。
步驟3:單擊“插入”選項,您可以開始使用 Adob??e Acrobat Pro DC 將頁面插入 PDF。
既然Acrobat太貴了,而且使用起來有點復雜,為什么不改用UPDF呢?一款更具成本效益的PDF編輯器,它具有向PDF添加頁面、編輯PDF文本和圖像、將PDF文檔轉換為其他格式、OCR以及許多其他功能等功能。
方法6.如何在線將頁面插入PDF
有一些網絡工具可用于在線將頁面添加到 PDF。例如iLovePDF、SmallPDF、Sejda等。使用在線工具的步驟類似,您可以按照以下步驟操作:
步驟1:轉到任何支持組織頁面功能的在線工具。您可以使用關鍵字“在線將頁面插入 PDF”在 Google 上搜索。谷歌會展示很多解決方案。
步驟2:將您的 PDF 文件上傳到在線網站。所有在線工具都要求您上傳 PDF 文件,并且大多數工具都對文件大小或頁碼有限制。如果您想免費使用它,則必須滿足其限制要求。
步驟3:成功上傳后,您現在可以找到將頁面插入 PDF 的工具。大多數在線工具只允許您插入空白頁面,但不允許插入其他 PDF 文件。
步驟4:修改后下載文件。
但是,使用在線工具將頁面添加到 PDF 并不穩定,因為您必須連接到互聯網。如果網絡不好,會影響結果,甚至損壞你的PDF文檔。
在線解決方案的另一個問題是您必須擔心文檔的安全性。為什么不使用 UPDF 來代替呢?它是桌面版本,非常穩定且使用速度快。您的所有文檔都將保存到本地存儲,您可以使用 UPDF 輕松編輯、轉換、保護和組織它們。
1. 如何向現有PDF添加空白頁?
您可以使用 UPDF 等 PDF 頁面編輯器向現有 PDF 添加空白頁面。為此,您可以將 PDF 上傳到 UPDF,然后單擊“組織頁面”圖標。接下來,您可以點擊頂部的“插入”選項,然后選擇“空白頁”選項。這樣就完成了!
2. 如何在 PDF 中添加和替換頁面?
使用 UPDF,您可以快速添加和替換頁面。為此,您可以進入“組織頁面”模式并選擇要替換的頁面。然后您只需單擊頂部的“替換”圖標并選擇一個文件來替換頁面即可。
3. 我可以更改 PDF 頁面嗎?
是的,當然可以。使用UPDF,您可以輕松更改PDF中的頁面,例如替換、添加、刪除、旋轉、提取、分割和裁剪PDF中的頁面。
結論
當您忘記在 PDF 中添加頁面時,您不必從頭開始文檔創建過程,而是可以使用 UPDF 在文檔的任何部分添加頁面。能夠做到這一點并讓事情變得簡單明了的最佳解決方案是 UPDF。無需了解任何內容,只需幾個簡單的步驟即可將頁面添加到文檔的任何部分。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。