HTML標簽相關的字符串格式化
string nl2br ( string $string )
nl2br() 就是將\n 替換成 <br> //javascript對\n才能夠執行換行,對</br>是不能執行換行
htmlspecialchars() 把一些預定義的字符轉換為 HTML 實體。
string htmlspecialchars(string,quotestyle,[character-set])
轉換以下字符及對應的實體
& (和號) 成為 &
" (雙引號) 成為 "
' (單引號) 成為 '
< (小于) 成為 <
> (大于) 成為 >
第二個參數: ENT_COMPAT 只轉換雙引號, 保留單引號, 為默認值 compat: 兼容性
ENT_QUOTES 同時轉換兩種引號 quotes: 引號
ENT_NOQUOTES 不對引號進行轉換
<html>
<body>
<?php
$str = "John & \" 'Adams'";
echo htmlspecialchars($str, ENT_COMPAT);
echo "<br />";
echo htmlspecialchars($str, ENT_QUOTES);
echo "<br />";
echo htmlspecialchars($str, ENT_NOQUOTES);
?>
</body>
</html>
輸出結果:John & " 'Adams'
John & " 'Adams'
John & " 'Adams'
htmlentities() 可以將所有的非ASCII碼字符轉換為對應的實體代碼;除字母、數字、\外, 漢字和鍵盤上其他字符都轉換
<?php
$str = "A 'quote' \" is <b>bold</b>" ;
echo htmlentities ( $str ); // 輸出后源代碼: A 'quote' is <b>bold</b>
echo htmlentities ( $str , ENT_QUOTES ); // 輸出后源代碼: A 'quote' is <b>bold</b>
?>
返回的結果:A 'quote' "is <b>bold</b>
A 'quote' "is <b>bold</b>
注意: htmlspecialchars()和htmlentities作用直接輸出HTML腳本
htmlspecialchars()和htmlentities()函數對于轉義字符"\"處理,不會轉義實體代碼,要么當轉義字符對待,要么原樣輸出;
PHP中htmlentities和htmlspecialchars的區別
這兩個函數的功能都是轉換字符為HTML字符編碼, 特別是url和代碼字符串。防止字符標記被瀏覽器執行。
使用中文時沒什么區別, 但htmlentities會格式化中文字符使得中文輸入是亂碼。
htmlentities轉換所有的html標記, htmlspecialchars只格式化& ' " < 和 > 這幾個特殊符號
addslashes() 在指定的預定義字符前添加反斜杠。
這些預定義字符是:單引號 (') 雙引號 (") 反斜杠 (\) NULL字符(\x00)
提示:該函數可用于為存儲在數據庫中的字符串以及數據庫查詢語句準備合適的字符串。
注釋:默認情況下,PHP 指令 magic_quotes_gpc 為 on,對所有的 GET、POST 和 COOKIE數據自動運行 addslashes()。
不要對已經被magic_quotes_gpc轉義過的字符串使用 addslashes(),因為這樣會導致雙層轉義。
遇到這種情況時可以使用函數 get_magic_quotes_gpc() 進行檢測。(如:$c=(!get_magic_quotes_gpc())?addslashes($c):$c;)
在本例中,我們要向字符串中的預定義字符添加反斜杠:
<?php
$str = "Who's John Adams?";
echo $str . " This is not safe in a database query.<br />";
echo addslashes($str) . " This is safe in a database query.";
?>
輸出:
Who's John Adams? This is not safe in a database query.
Who\'s John Adams? This is safe in a database query.
<?php
header("Content-type:text/html; charset=utf-8");
$str = "wo are \x0a studying \x00 php";
echo $str;
echo "<br>";
echo addslashes($str);
?>
輸出:
wo are studying php
wo are studying >wo are studying \0 php< php
stripslashes() 刪除反斜線("\")
在提交的表單數據中 ' " \ 等字符前被自動加上一個\ ,這是配置文件php.ini中選項magic_quotes_gpc在起作用,
默認是打開的,如果不處理則將數據保存到數據庫時,有可能會被數據庫誤當成控制符號而引起錯誤。
通常htmlspecialchars()和stripslashes()函數復合的方式,聯合處理表單中的提交的數據htmlspecialchars(stripslashes())
strip_tags()
string strip_tags ( string $str [, string $allowable_tags ] )
剝去 HTML、XML 以及 PHP 的標簽。
<?php
echo strip_tags("Hello <b><i>world!</i></b>","<b>");
?>
輸出結果:Hello world!
實例:
<?php
$str = "<b>webserver;</b> & \ 'Linux' & Apache";
echo "$str"; //直接輸出
echo "<br/>";
echo htmlspecialchars($str,ENT_COMPAT); //只轉換雙引號,為默認參數
echo "<br />";
echo htmlspecialchars($str,ENT_NOQUOTES); //不對引號進行轉換
echo "<br />";
echo htmlspecialchars($str,ENT_QUOTES); //同時轉換單引號和雙引號
echo "<br />";
echo htmlentities($str); //將所有的非ASCII碼字符轉換為對應的實體代碼
echo "<br />";
echo addslashes($str); //將" ' \ 字符前添加反斜線
echo "<br />";
echo stripslashes($str); //刪除反斜線
echo "<br />";
echo strip_tags($str); //刪除<html>標記
?>
輸出結果:
webserver; & \ 'Linux' & Apache
一、項目目標】
通過Python爬取QQ音樂數據(一)我們實現了獲取 QQ 音樂指定歌手單曲排行指定頁數的歌曲的歌名、專輯名、播放鏈接。
此次我們在之前的基礎上獲取QQ音樂指定歌曲的歌詞及前15個精彩評論。
【二、需要的庫】
主要涉及的庫有:requests、json、html
image
【三、項目實現】
1、以歌曲“泡沫”為例,查看該界面的XHR
image
2、通過對XHR的Size進行排序,逐個查看(參考英文含義),我們看到第一個紅框內是歌曲評論,第二個框內是歌詞!
image
image
3、分別查看這兩條數據Headers里面Parms參數。
image
4、發現這幾個參數可能會代表不同的歌曲,那到底是哪個呢,我們在代開另一首歌對比一下。
image
5、發現只有這個topid不同,其他都一樣,這就代表topid代表不同歌曲的id,同理我們看一下歌詞。
image
6、確定下來:musicid= topid = 歌曲的id,接下來我們的任務是找到這個id。
7、返回以下界面,也就是我們上一個項目的主戰場。
image
參考上一個項目,很容易找到“id”的值就是我們要尋找的id。
所以思路確定下來:先通過input()輸入歌名生成url_1找到該歌曲的“id”參數,再生成url_2獲取歌詞和評論。
8、代碼實現:獲取歌曲id,如下所示:
import requests,html,json
url_1 = 'https://c.y.qq.com/soso/fcgi-bin/client_search_cp'
headers = {
'user-agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36',
# 標記了請求從什么設備,什么瀏覽器上發出
}
i = input('請輸入需要查詢歌詞的歌曲名稱:')
params = {'ct': '24', 'qqmusic_ver': '1298', 'new_json': '1', 'remoteplace': 'txt.yqq.song', 'searchid': '71600317520820180', 't': '0', 'aggr': '1', 'cr': '1', 'catZhida': '1', 'lossless': '0', 'flag_qc': '0', 'p': '1', 'n': '10', 'w': i, 'g_tk': '5381', 'loginUin': '0', 'hostUin': '0', 'format': 'json', 'inCharset': 'utf8', 'outCharset': 'utf-8', 'notice': '0', 'platform': 'yqq.json', 'needNewCode': '0'}
res_music = requests.get(url_1,headers=headers,params=params)
# 發起請求
json_music = res_music.json()
id = json_music['data']['song']['list'][0]['id']
print(id)
9、代碼實現:獲取歌詞實現方法如下:
url_2 = 'https://c.y.qq.com/lyric/fcgi-bin/fcg_query_lyric_yqq.fcg'
headers = {
'user-agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36',
# 標記了請求從什么設備,什么瀏覽器上發出
}
params = {
'nobase64':'1',
'musicid':id, #用上面獲取到的id
'-':'jsonp1',
'g_tk':'5381',
'loginUin':'0',
'hostUin':'0',
'format':'json',
'inCharset':'utf8',
'outCharset':'utf-8',
'notice':'0',
'platform':'yqq.json',
'needNewCode':'0',
}
res_music = requests.get(url_2,headers=headers,params=params)
# 發起請求
js = res_music.json()
lyric = js['lyric']
lyric_html = html.unescape(lyric) #用了轉義字符html.unescape方法
# print(lyric_html)
f1 = open(i+'歌詞.txt','a',encoding='utf-8')
f1.writelines(lyric_html)
f1.close() #存儲到txt中
input('下載成功,按回車鍵退出!')
10、代碼實現:獲取評論。
url_3 = 'https://c.y.qq.com/base/fcgi-bin/fcg_global_comment_h5.fcg'
headers = {
'user-agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36',
// 標記了請求從什么設備,什么瀏覽器上發出
}
params = {'g_tk_new_20200303': '5381', 'g_tk': '5381', 'loginUin': '0', 'hostUin': '0', 'format': 'json', 'inCharset': 'utf8', 'outCharset': 'GB2312', 'notice': '0', 'platform': 'yqq.json', 'needNewCode': '0', 'cid': '205360772', 'reqtype': '2', 'biztype': '1', 'topid': id, 'cmd': '8', 'needmusiccrit': '0', 'pagenum': '0', 'pagesize': '25', 'lasthotcommentid': '', 'domain': 'qq.com', 'ct': '24', 'cv': '10101010'}
res_music = requests.get(url_3,headers=headers,params=params)
// 發起請求
js = res_music.json()
comments = js['hot_comment']['commentlist']
f2 = open(i+'評論.txt','a',encoding='utf-8') // 存儲到txt中
for i in comments:
comment = i['rootcommentcontent'] + '\n——————————————————————————————————\n'
f2.writelines(comment)
// print(comment)
f2.close()
input('下載成功,按回車鍵退出!')
11、封裝函數
12、結果展示
image
image
image
【四、總結】
1、項目二比項目一稍復雜一點,多了一步獲取歌曲id的步驟;
2、通過XHR爬取數據一般要使用json,格式為:
res =requests.get(url)
json =res.json()
list = json[‘’][‘’]…
3、學習了轉義字符html.unescape方法;
4、保存到txt還可以用 with open() as的方法;
5、Python爬取QQ音樂數據(第三彈)將為大家帶來如何爬取更多評論,并生成詞云圖(wordcloud)。
6、需要本文源碼的話,請在公眾號后臺回復“QQ音樂”四個字進行獲取。
****看完本文有收獲?請轉發分享給更多的人****
想學習更多Python網絡爬蟲與數據挖掘知識,可前往專業網站:http://pdcfighting.com/
還記得前面學過的,計算稅后薪資 的程序的例子嗎?
讓用戶輸入薪資,乘以75% 得到稅后薪資,打印到屏幕上。
代碼如下
salary = input('請輸入薪資:') # 計算出稅后薪資 aftertax = int(salary)*75/100 # 再轉化為字符串,方便下面的字符串拼接 aftertaxStr = str(aftertax) print('稅后薪資是:' + aftertaxStr)
如果我們要顯示的不僅是稅后薪資,還有稅前薪資,繳稅額。像下面這樣
稅前薪資是 10000元, 繳稅:2500元, 稅后薪資是:7500元
代碼又該怎么寫呢?
我想肯定難不倒聰明的你。
對了, 加號可以連接多個字符串,可以這樣
salary = input('請輸入薪資:') # 計算出繳稅額,存入變量tax tax = int(salary) *25/100 # 轉化為字符串,方便下面的字符串拼接 taxStr = str(tax) # 計算出稅后工資,存入變量aftertax aftertax = int(salary) *75/100 # 轉化為字符串,方便下面的字符串拼接 aftertaxStr = str(aftertax) print('稅前薪資是:' + salary + '元, 繳稅:' + taxStr + '元, 稅后薪資是:' + aftertaxStr + '元')
運行一下,是不是確實實現了我們的需求。
但是這里面有問題嗎?
對了最后一句代碼,寫的是不是有點。。。。。燒腦?
字符串的多次拼接比較麻煩,一不小心就可能 漏掉了 一個加號或者引號。
如果我們能夠這樣寫
稅前薪資是 x 元, 繳稅:y 元, 稅后薪資是:z 元
然后,直接將我們計算好的 稅前薪資, 繳稅額,稅后薪資 分別作為 x, y, z 填入進去。
這樣就不需要麻煩的字符串拼接了。Python 支持這樣的操作,這樣的操作稱之為字符串的格式化。
可以點擊文章末尾【了解更多】,或者百度搜索白月黑羽教Python,一起來學Python吧
python3 中字符串格式化有如下幾種方法
printf 風格
這種方式 和 傳統的C語言printf函數使用一樣的格式化語法。
比如上面的例子里面,我們使用這種方法可以這樣格式化字符串
salary = input('請輸入薪資:') # 計算出繳稅額,存入變量tax tax = int(salary) *25/100 # 計算出稅后工資,存入變量aftertax aftertax = int(salary) *75/100 print('稅前薪資是:%s 元, 繳稅:%s 元, 稅后薪資是:%s 元' % (salary,tax,aftertax))
大家運行一下看看,可以發現也能正確的輸出結果。
大家可以發現,和前面的字符串拼接不同, 我們使用了下面這樣模板一樣的字符串
稅前薪資是:%s 元, 繳稅:%s 元, 稅后薪資是:%s 元
其中 %s 就是模板中的占位符,表示這個位置先占著,待會兒要有數據填入到這里。
然后再提供一個元組,里面依次存放需要填入到 %s 占位位置 數據。
這里是使用變量 (salary,tax,aftertax) 。
%s 是一種格式化符號, Python 解釋器 看到 %s , 就會調用內置函數 str(),并將對應的格式化對象作為的參數傳入 , 返回的結果字符串填入對應占位符。
簡單說 %s 位置填入的結果,就是調用str函數的返回值。
str()內置函數,它的參數幾乎所有內置類型的對象,字符串、 整數、 浮點數 、list 等等都可以
所以 我們可以用 %s 為占位符, 對應的格式化對象, 不僅僅是字符串,可以是整數、 浮點數 、list 等等。
格式化字符串里面占位符的個數 必須 和 后面對應的格式化對象個數相同,
比如
'稅前薪資:%s 元, 繳稅:%s 元, 稅后薪資:%s 元' % (salary,tax,aftertax)
占位符是3個,那么后面的元組里面的格式化對象就是3個。
如果占位符是2個,后面的元組里面的格式化對象就應該是2個。像這樣
'稅前薪資:%s 元, 繳稅:%s 元' % (salary,tax)
如果占位符是1個,后面的元組里面的格式化對象就應該是1個。像這樣
'稅前薪資:%s 元' % (salary,)
還記得,我們說過, 元組里面只有1個元素,后面別忘了加個逗號。
像這種只有一個格式化對象的情況下,可以直接就用格式化對象,不需要放到元組里面,像這樣
'稅前薪資:%s 元' % salary
指定寬度和對齊
如果我們需要將下面這樣的3個字符串進行格式化
'稅前薪資:%s 元' % 100000 '稅前薪資:%s 元' % 10000 '稅前薪資:%s 元' % 1000
得到的結果如下
稅前薪資:100000 元 稅前薪資:10000 元 稅前薪資:1000 元
會發現,由于被格式化的數字對應的字符串長度不同,導致結果不對齊。
這樣的輸出結果顯得不夠美觀。
我們可以指定格式化結果的字符串長度,比如我想要格式化結果至少10個字符,不足10個字符補空格,就可以這樣
'稅前薪資:%10s 元' % 100000 '稅前薪資:%10s 元' % 10000 '稅前薪資:%10s 元' % 1000
%10s 中的 10 就是指定了格式化結果至少10個字符。
得到的結果就是
稅前薪資: 100000 元 稅前薪資: 10000 元 稅前薪資: 1000 元
如果我們希望是左邊對齊,而不是右邊對齊,就可以加一個 - 好,像這樣
'稅前薪資:%-10s 元' % 100000 '稅前薪資:%-10s 元' % 10000 '稅前薪資:%-10s 元' % 1000
可以得到如下結果
稅前薪資:100000 元 稅前薪資:10000 元 稅前薪資:1000 元
%d 和 %f
占位符除了 %s ,還有其它的一些。
常見的是 %d 和 %f 。
%d 用在 格式化對象 是 整數的情況 ,比如
'稅前薪資:%d 元' % 10000
%f 用在 格式化對象 是 浮點數的情況,比如
'稅前薪資:%f 元' % 10000.32
前面我們說過了 %s 也可以用來格式化 整數和 浮點數,但是有些情況下, %d %f 有特別的用處。
比如,打印數字的時候,我們指定寬度,而且不足寬度,希望補零,而不是補空格,就可以這樣
'稅前薪資:%010d 元' % 100000 '稅前薪資:%010d 元' % 10000 '稅前薪資:%010d 元' % 1000
可以得到如下結果
稅前薪資:0000100000 元 稅前薪資:0000010000 元 稅前薪資:0000001000 元
對于小數的格式化,通常使用 %f,如下
'稅前薪資:%010f 元' % 1000.4522 '稅前薪資:%010f 元' % 1008.6621 '稅前薪資:%010f 元' % 1009.3351
可以得到如下結果
稅前薪資:1000.452200 元 稅前薪資:1008.662100 元 稅前薪資:1009.335100 元
如果我們想保留小數點后面2位數字,就可以加上 .2 像這樣
'稅前薪資:%010.2f 元' % 1000.4522 '稅前薪資:%010.2f 元' % 1008.6621 '稅前薪資:%010.2f 元' % 1009.3351
可以得到如下結果
稅前薪資:0001000.45 元 稅前薪資:0001008.66 元 稅前薪資:0001009.34 元
參考文檔
詳細的 printf風格的格式化,可以參考如下官方文檔
https://docs.python.org/3/library/stdtypes.html#printf-style-string-formatting
我們這里不打算介紹更多了,因為到了Python3.6 ,有另外一種更方便的方式: f-string 格式化
f-string 格式化
f-string 格式化 就是在字符串模板前面加上f,然后占位符使用{} ,里面直接放入對應的數據對象。
如下所示
f'稅前薪資是:{salary}元, 繳稅:{tax}元, 稅后薪資是:{aftertax}元'
完整的代碼如下
salary = input('請輸入薪資:') # 計算出繳稅額,存入變量tax tax = int(salary) *25/100 # 計算出稅后工資,存入變量aftertax aftertax = int(salary) *75/100 print(f'稅前薪資是:{salary}元, 繳稅:{tax}元, 稅后薪資是:{aftertax}元')
運行一下,可以發現輸出結果一樣。
這種方式是不是更加的直觀明了呢?
要注意的是,這種寫法必須要Python解釋器是3.6 以后的版本才支持哦。
指定寬度
同樣,為了輸出對齊,我們需要指定填入的字符串的寬度。
方法是,在括號里面的變量后面加上 :寬度值
比如
salary = 10000 print(f'{salary:10}')
f'{salary:10}' 就指定了 寬度為10 個字符, 如果填入的字符串不足10個字符,就在前面加上空格
比如上面的輸出結果就是
>>> salary = 10000 >>> print(f'{salary:10}') 10000
完整的一個示例程序如下
# 員工 1 salary = 8000 tax = int(salary) *25/100 aftertax = int(salary) *75/100 print(f'稅前薪資是:{salary:8}元, 繳稅:{tax:8}元, 稅后薪資是:{aftertax:8}元') # 員工 2 salary = 15000 tax = int(salary) *25/100 aftertax = int(salary) *75/100 print(f'稅前薪資是:{salary:8}元, 繳稅:{tax:8}元, 稅后薪資是:{aftertax:8}元') # 員工 3 salary = 100000 tax = int(salary) *25/100 aftertax = int(salary) *75/100 print(f'稅前薪資是:{salary:8}元, 繳稅:{tax:8}元, 稅后薪資是:{aftertax:8}元')
運行一下結果如下:
稅前薪資是: 8000元, 繳稅: 2000.0元, 稅后薪資是: 6000.0元 稅前薪資是: 15000元, 繳稅: 3750.0元, 稅后薪資是: 11250.0元 稅前薪資是: 100000元, 繳稅: 25000.0元, 稅后薪資是: 75000.0元
這樣,整體就顯得很清爽。
當然上面的代碼 有很多重復的部分。聰明的你想到怎么優化一下了嗎?
對了,用函數。像這樣
def calcTax(salary): tax = int(salary) *25/100 aftertax = int(salary) *75/100 print(f'稅前薪資是:{salary:8}元, 繳稅:{tax:8}元, 稅后薪資是:{aftertax:8}元') # 員工 1 calcTax(8000) # 員工 2 calcTax(15000) # 員工 3 calcTax(100000)
左對齊
上面的輸出結果是不足在前面補空格,最終的結果就是右邊對齊。 如果我們想左對齊,可以在括號里使用 < 符號
像這樣 {salary:<8}
def calcTax(salary): tax = int(salary) *25/100 aftertax = int(salary) *75/100 print(f'稅前薪資是:{salary:<8}元, 繳稅:{tax:<8}元, 稅后薪資是:{aftertax:<8}元') calcTax(8320) calcTax(15023) calcTax(100030)
運行結果如下:
稅前薪資是:8320 元, 繳稅:2080.0 元, 稅后薪資是:6240.0 元 稅前薪資是:15023 元, 繳稅:3755.75 元, 稅后薪資是:11267.25元 稅前薪資是:100030 元, 繳稅:25007.5 元, 稅后薪資是:75022.5 元
小數點后位數
如果我們想指定小數點后保留幾位,可以像這樣 {salary:<8.1f}
后面的.1f就表示小數點后面保留1位
def calcTax(salary): tax = int(salary) *25/100 aftertax = int(salary) *75/100 print(f'稅前薪資是:{salary:8.1f}元, 繳稅:{tax:8.1f}元, 稅后薪資是:{aftertax:8.1f}元') calcTax(8320) calcTax(15023) calcTax(100030)
運行結果如下:
稅前薪資是: 8320.0元, 繳稅: 2080.0元, 稅后薪資是: 6240.0元 稅前薪資是: 15023.0元, 繳稅: 3755.8元, 稅后薪資是: 11267.2元 稅前薪資是:100030.0元, 繳稅: 25007.5元, 稅后薪資是: 75022.5元
不足補零
如果我們想在不足指定寬度的時候不是補空格,而是補數字0,可以像這樣 {salary:08}
def calcTax(salary): tax = int(salary) *25/100 aftertax = int(salary) *75/100 print(f'稅前薪資是:{salary:08}元, 繳稅:{tax:08.1f}元, 稅后薪資是:{aftertax:08.1f}元') calcTax(8320) calcTax(15023) calcTax(100030)
運行結果如下:
稅前薪資是:00008320元, 繳稅:002080.0元, 稅后薪資是:006240.0元 稅前薪資是:00015023元, 繳稅:003755.8元, 稅后薪資是:011267.2元 稅前薪資是:00100030元, 繳稅:025007.5元, 稅后薪資是:075022.5元
轉義符
我們在代碼中定義一個字符串的時候,有些字符不太方便用鍵盤直接敲出來,或者敲出來看起來也不知道那是一個字符。
比如 換行符, 我們可以用回車鍵,敲出來。
a = '''abcd efg'''
其中abcd 和efg之間其實就是有一個換行字符。
有時候像這樣的字符出現在字符串中,可以使用轉義寫法來表示,比如上的字符串就等價于
a = 'abcd\nefg'
‘\n’就是一個轉義字符,表示一個換行字符。
處理’\n’ 之外,還有一些其他的字符可以用轉義符表示,比如我們還可以用 ‘\t’表示tab字符。
Python字符串中 轉義字符都是用反斜杠 \ 開頭 。
如果字符串中本身需要有反斜杠,并非轉義,比如Windows下面的路徑
path = 'c:\windows\temp'
其中的 \t 會被當做一個tab字符,而不是 \ 和 t 兩個字符。
這時,可以在在前面再加一個反斜杠, 像下面這樣
path = 'c:\\windows\\temp'
也可以在字符前面加上一個 r ,表示字符串內容是raw string, 無需轉義,像這樣
*請認真填寫需求信息,我們會在24小時內與您取得聯系。