整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

和HTML标签相关的字符串格式化

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, 无需转义,像这样