.背景:
即時(shí)通訊、桌面端app開發(fā)、當(dāng)用戶和用戶聊天,當(dāng)發(fā)送聊天消息時(shí),須要作收到消息通知,因?yàn)橛玫降募夹g(shù)棧是electron、它也有自己的通知模塊、因?yàn)槠渌脑驎簳r(shí)用不了 最后查到HTML5新增的 Notification API的通知功能。即便將瀏覽器窗口最小化,依然會(huì)收到消息通知、所以就先用它吧、后面再后話處理一下。
2.通知權(quán)限:
2.1 首先須要 看瀏覽器是否支持 Notification ,支持才有下文,不然就此止步;
2.2 經(jīng)過 Notification.permission 檢測(cè)用戶是否容許通知:
// Notification.permission === 'granted' 用戶容許
// Notification.permission === 'denied' 用戶拒絕
// Notification.permission === 'denied' 不知道用戶的選擇,默認(rèn)
if(Notification.permission === 'granted'){
console.log('用戶容許通知');
instance_init(title, options);
}else if(Notification.permission === 'denied'){
console.log('用戶拒絕通知');
}else{
console.log('用戶還沒選擇,去向用戶申請(qǐng)權(quán)限吧');
Notification.requestPermission(function(status) {
if(status=='granted'){
console.log('用戶容許通知');
instance_init(title, options);
}else if(status=='denied'){
console.log('用戶拒絕通知');
}else{
console.log('用戶還沒選擇');
}
});
}
3. 主要用到的參數(shù)。其他參數(shù)了解:notification - Web API 接口參考 | MDNMDN Web DocsMDN logoMozilla logo
title:通知的標(biāo)題
options:通知的設(shè)置選項(xiàng)(可選)。
body:通知的內(nèi)容。
tag:表明通知的一個(gè)識(shí)別標(biāo)簽,相同tag時(shí)只會(huì)打開同一個(gè)通知窗口。
icon:要在通知中顯示的圖標(biāo)的URL。
image:要在通知中顯示的圖像的URL。
data:想要和通知關(guān)聯(lián)的任務(wù)類型的數(shù)據(jù)。
requireInteraction:通知保持有效不自動(dòng)關(guān)閉,默認(rèn)為false。
4.代碼實(shí)現(xiàn)
4.1原生html5方式
<html>
<head>
<meta charset="UTF-8">
<title>H5通知功能 </title>
</head>
<body>
<script type="text/javascript">
// 調(diào)用通知方法
showMsgNotification('狀態(tài)更新提醒','你的朋友圈有3條新狀態(tài),快去查看吧');
/**
* H5通知功能
*/
function showMsgNotification(out_title, out_msg) {
var title = out_title ? out_title : '更新狀態(tài)標(biāo)題';
var options = {
body: out_msg ? out_msg : "更新狀態(tài)內(nèi)容", // 通知主體
requireInteraction: true, // 不自動(dòng)關(guān)閉通知
icon: 'http://img18.house365.com/newcms/2017/03/16/148964317858ca26aacf7b5.jpg', // 通知圖標(biāo)
tag: 'hangge',
};
var Notification = window.Notification || window.mozNotification || window.webkitNotification; // 瀏覽器作兼容處理
if(Notification) { //支持桌面通知
if(Notification.permission == "granted") { //已經(jīng)容許通知
instance_init(title, options);
} else {
//第一次詢問或已經(jīng)禁止通知(若是用戶以前已經(jīng)禁止顯示通知,那么瀏覽器不會(huì)再次詢問用戶的意見,Notification.requestPermission()方法無效)
Notification.requestPermission(function(status) {
if(status === "granted") { //用戶容許
instance_init(title, options);
} else { //用戶禁止
console.log('禁止')
return false
}
});
}
/**
* Notification定義
* */
function instance_init(title, options){
var instance = new Notification(title, options);
instance.onclick = function() {
console.log('onclick');
// 關(guān)閉通知
instance.close();
};
instance.onerror = function() {
console.log('onerror');
};
instance.onshow = function() {
console.log('onshow');
};
instance.onclose = function() {
console.log('onclose');
};
}
} else { //不支持(IE等)
console.log("不支持的瀏覽器")
}
}
</script>
</body>
</html>
4.2 electron方式、調(diào)用即可
在《Python進(jìn)階記錄之urllib模塊》中,我們介紹了Python內(nèi)置的HTTP請(qǐng)求庫(kù)urllib模塊的基本用法,需要重點(diǎn)掌握使用urllib的request模塊進(jìn)行簡(jiǎn)單的get、post請(qǐng)求。今天我們講一下Python內(nèi)置的HTML解析庫(kù)HTMLParser模塊,并結(jié)合之前的re模塊和urllib模塊實(shí)現(xiàn)爬取指定新聞頁提取新聞文本內(nèi)容的小需求。
我們使用urllib模塊進(jìn)行HTTP請(qǐng)求獲取到的是整個(gè)網(wǎng)頁的HTML,但是我們往往只需要其中一部分對(duì)我們有用的內(nèi)容。這時(shí)我們就可以使用HTMLParser模塊來幫助我們處理HTML。
HTMLParser是Python內(nèi)置的專門用來解析HTML的模塊。利用HTMLParser,我們可以分析出一段HTML里面的標(biāo)簽、數(shù)據(jù)等,是一種處理HTML的簡(jiǎn)便途徑。我們先來看一個(gè)官方的例子。
HTMLParser模塊官方例子
從上述代碼中可以看出,HTMLParser模塊來自html.parser,導(dǎo)包時(shí)要格外注意。使用HTMLParser時(shí),我們需要定義一個(gè)繼承自HTMLParser的子類,并根據(jù)需要重寫HTMLParser父類中的成員方法。例子中使用的各方法作用如下:
handle_starttag(tag, attrs):識(shí)別HTML的開始標(biāo)簽,例如<html>、<title>、<body>、<div>等。
handle_endtag(tag):識(shí)別HTML的結(jié)束標(biāo)簽,例如</html>、</body>、</div>、</p>等。
handle_data(data):識(shí)別HTML標(biāo)簽內(nèi)容,例如“<p>Test</p>”中的Test。
handle_startendtag(tag, attrs):識(shí)別沒有結(jié)束標(biāo)簽的HTML標(biāo)簽,例如<img />等。
handle_comment(data):識(shí)別HTML中的注釋內(nèi)容,一般是“<!-- 注釋 -->”中的注釋內(nèi)容。
HTMLParser采用的是一種事件驅(qū)動(dòng)的模式,HTMLParser找到一個(gè)特定的標(biāo)記時(shí),它會(huì)去調(diào)用一個(gè)用戶定義的函數(shù),以此來通知程序處理。
我們可以利用這些方法來實(shí)現(xiàn)HTML解析相關(guān)的功能。其中參數(shù)tag表示的是HTML標(biāo)簽,attrs是一個(gè)列表,列表元素為一個(gè)個(gè)“(屬性,值)”形式的元組。HTMLParser會(huì)自動(dòng)將tag和attrs都轉(zhuǎn)為小寫,解析時(shí)調(diào)用feed( )方法,把待解析的HTML字符串傳入即可。
現(xiàn)在有以下網(wǎng)頁,我們需要獲取出里面的新聞文本內(nèi)容。
待請(qǐng)求網(wǎng)頁
首先就是獲取該網(wǎng)頁的HTML。經(jīng)過上節(jié)內(nèi)容的學(xué)習(xí),我們很容易想到利用urllib庫(kù)請(qǐng)求獲取這個(gè)網(wǎng)頁的HTML。
獲取網(wǎng)頁HTML
代碼很簡(jiǎn)單,使用urlopen( )方法,傳入url即可。此時(shí),我們已經(jīng)得到了整個(gè)網(wǎng)頁的HTML,但是我們要獲取的是新聞內(nèi)容,顯然此時(shí)的HTML中有太多我們不需要的東西。
觀察整個(gè)網(wǎng)頁HTML,我們發(fā)現(xiàn)新聞內(nèi)容是包含在一個(gè)div中的。
新聞內(nèi)容相關(guān)HTML
我們可以使用正則表達(dá)式re模塊將包含新聞內(nèi)容的這個(gè)div提取出來。
提取新聞內(nèi)容相關(guān)的HTML
新聞內(nèi)容的div格式主要是:<div class="article-content">...</div>。由于該div下嵌套了其他div,如果我們直接使用r'<div class=\"article-content\">(.*?)</div>'進(jìn)行正則提取,會(huì)發(fā)現(xiàn)在下一個(gè)</div>處就截?cái)嗔恕榱苏_提取所有新聞內(nèi)容相關(guān)的HTML,我們需要在</div>前加一個(gè)</p>,以保證是在新聞內(nèi)容結(jié)束的</div>處截?cái)唷?/p>
此時(shí),我們已經(jīng)得到了新聞內(nèi)容相關(guān)的HTML。現(xiàn)在還剩最后一部,就是把HTML標(biāo)簽去掉,保留新聞文本內(nèi)容。這一步,我們就可以利用HTMLParser來實(shí)現(xiàn)了。
HTMLParser提取新聞內(nèi)容
我們定義一個(gè)繼承自HTMLParser的子類,然后重寫handle_data(data)方法獲取當(dāng)前HTML中的文本內(nèi)容即可。由于我們定義的私有變量__text是通過一個(gè)列表來逐條接收新聞內(nèi)容的,所以我們?cè)陬愔卸x一個(gè)獲取私有變量__text的方法,并將列表轉(zhuǎn)換成字符串。至此,我們已經(jīng)獲取到了新聞的文本內(nèi)容。
然而,當(dāng)前文本內(nèi)容一整段在一起,看起來并不美觀,與實(shí)際分段的新聞文本內(nèi)容也有差別。我們可以使用HTMLParser來美化新聞內(nèi)容。我們知道,網(wǎng)頁上的新聞內(nèi)容是通過“\n”、“\t”、“<br/>”等特殊符號(hào)或標(biāo)簽進(jìn)行間隔和分段的。因此,我們只需要在解析時(shí)替換掉這些特殊符號(hào)和標(biāo)簽即可。
替換特殊符號(hào)和標(biāo)簽
重寫handle_data(data)方法,識(shí)別文本的同時(shí)替換掉“\t”、“\r”、“\n”等特殊字符;重寫handle_starttag(tag, attrs)方法,識(shí)別出<p>、<br>進(jìn)行替換;重寫handle_startendtag(tag, attrs)方法,識(shí)別出<br/>進(jìn)行替換。再次運(yùn)行程序,可以看到,新聞內(nèi)容進(jìn)行了分段,看起來就美觀多了。
上述過程實(shí)現(xiàn)了一個(gè)非常簡(jiǎn)單的爬蟲,爬取新聞網(wǎng)頁,提取新聞內(nèi)容。當(dāng)然,由于我們目前還沒介紹其他第三方庫(kù),實(shí)現(xiàn)起來還不夠靈活,例如獲取新聞內(nèi)容的div我們現(xiàn)在只能通過正則表達(dá)式實(shí)現(xiàn),但實(shí)際上,如果使用lxml(etree、xpath)、BeautifulSoup等第三方庫(kù)會(huì)更簡(jiǎn)單實(shí)用。
以上內(nèi)容介紹了Python內(nèi)置的HTML解析庫(kù)HTMLParser模塊,需要重點(diǎn)掌握HTMLParser類常用方法的作用,能夠重寫這些方法進(jìn)行自定義解析。感謝大家的支持與關(guān)注,歡迎一起學(xué)習(xí)交流~
之前官方正式宣布Alert Control中支持HTML & CSS模板,正如上篇文章中所述,HTML 和 CSS 模板允許您輕松創(chuàng)建自定義/現(xiàn)代通知。在本文中,將分享更多與模板相關(guān)的更新,您可以期待DevExpress的v22.1版本了!
DevExpress Universal Subscription官方最新版免費(fèi)下載試用,歷史版本下載,在線文檔和幫助文件下載-慧都網(wǎng)
在以前的版本中,技術(shù)團(tuán)隊(duì)為WinForms ListBox控件引入了標(biāo)準(zhǔn)模板——一種類似于平鋪視圖中可用的設(shè)計(jì)器,使您可以輕松地在 ListBox 項(xiàng)目表面上排列元素。v22.1 中可用的 HTML 和 CSS 模板將這種自定義靈活性提升到一個(gè)全新的水平。
上圖取自技術(shù)團(tuán)隊(duì)更新的HTML Demo Center模塊,使用以下HTML標(biāo)記來創(chuàng)建此示例UI。
<div class="contact">
<div class="contact-avatar">
<img class="photo" src="${Photo}" />
<div class="status" id="status"></div>
</div>
<div>
<div class="contact-body">
<div class="contact-info">
<div class="name-info">
<div class="name">${FirstName} {LastName}</div>
<img class='info' src='Contact' id="info" />
</div>
<div class="phone">${HomePhone}</div>
</div>
</div>
<div class='selection'></div>
</div>
</div>
ComboBox編輯與 ListBox Edit 模板類似,您可以利用 ${FieldName} 語法來添加數(shù)據(jù)占位符。 在運(yùn)行時(shí),這些占位符將替換為來自數(shù)據(jù)源的實(shí)際值。 正如您在下面看到的,這使HTML 和 CSS 模板成為構(gòu)建數(shù)據(jù)感知控件布局的完美工具。
此示例 ComboBox Edit UI 的模板如下:
<div class="contact">
<div class="contact-avatar">
<img class="photo" src="${Photo}" />
</div>
<div>
<div class="contact-body">
<div>
<div class="name">${FirstName} {LastName}</div>
<div class="label">${Department}</div>
</div>
</div>
<div class='selection'></div>
</div>
</div>
在 v21.2 發(fā)布周期中引入了對(duì) TileView 的 HTML 和 CSS 模板支持,在官方即將發(fā)布的版本中,您將能夠根據(jù)內(nèi)容大小調(diào)整圖塊。
要啟用此功能,只需將 OptionsHtmlTemplate.ItemAutoHeight 屬性設(shè)置為 true。
上面的圖像是使用以下 HTML 代碼創(chuàng)建的:
<div class="container">
<div class="card">
<div class="stripe" id="stripe"></div>
<div class="content">
<div class="top-block">
<div class="caption"><b>${Name}</b></div>
</div>
<div class="description">${Description}</div>
<div class="bottom-block">
<div class="bottom-block-near">
<div><span style="color:@DisabledText">Due Date: </span>${DueDate}</div>
<div><span style="color:@DisabledText">Employee: </span>${Employee}</div>
</div>
<div class="status">${Status}%</div>
</div>
</div>
</div>
</div>
DevExpress WinForm
DevExpress WinForm擁有180+組件和UI庫(kù),能為Windows Forms平臺(tái)創(chuàng)建具有影響力的業(yè)務(wù)解決方案。DevExpress WinForms能完美構(gòu)建流暢、美觀且易于使用的應(yīng)用程序,無論是Office風(fēng)格的界面,還是分析處理大批量的業(yè)務(wù)數(shù)據(jù),它都能輕松勝任!
*請(qǐng)認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。