Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
近在設計篩選相關頁面的時候,找來了一些參考。發現這種竟然有這么多不同種類的篩選設計類型,雖然以前在使用APP的時候也注意到過,但是用用就忘記了。正好找機會進行了下總結歸類,以后在碰到類似設計的時候能夠快速思考對應哪種類型的設計比較合適。
大致我進行了如下分類:
標簽式篩選我們是最為常見的,比較典型的是在搜索頁面篩選中被廣泛使用。怎么運用這里就不多說了,大家都非常熟悉。
如下圖:
我們在日常生活類購物的時候,例如購買日用品、食物、便利商品的時候經常會看到這種左側導航式篩選、這種導航式篩選比較適合品種類目特別多,層級分類較深的時候。
單一層級如上圖兩鮮的APP,類似這種生活便利型的的APP最為常見,多層級的我們可以看下右上圖的設計。
這種設計的好處是對于相對復雜的層級分類,能夠清晰有條理的收納??梢员M可能多的展示更多入口,尤其是對于購物類的APP能夠增加多頻道的流量,當然流量也可以轉換更多的交易量。
下拉式篩選分為:下拉彈窗、下拉卡片式篩選、下拉菜單加左側列表層疊式。
(1)下拉彈窗
我們可以看到上圖左一嗶哩嗶哩采用的下拉彈窗,這種樣式是篩選中比較常見的,最為普通的是單一層下拉彈窗,但這里嗶哩嗶哩運用了層疊式的篩選形式,在設計上上面一排跟下面一排除了文字大小并沒有太大的區分,體驗很差,再加上下拉彈窗一大堆的文字分類,密集恐懼癥有沒有。
(2)下拉卡片式篩選
那么我們再來看看京東同樣運用了層疊式的下拉彈窗設計,第一排跟第二排設計上有了明顯的區分,第二排采用了底板標簽式樣,很好的區分了上下的層次感,另外一點為了進一步加深區分,利用矩形標簽的形狀,采用了卡片式的選項卡分類設計。信息雖多但每一個細節的層次感區分明顯,不失為好的設計。
(3)下拉菜單加左側列表層疊式
這種篩選形式首先采用了之前說的列表層疊式樣式,同時它又是下拉菜單的形式。我們再次跟嗶哩嗶哩的設計進行對比,如果像嗶哩嗶哩這種信息模塊特別多的情況,其實可以對三級菜單進行再次歸類,結合左側列表層疊的樣式進行設計。或是借鑒下京東的層次區分的設計,展示效果會大大提升。
折疊式篩選在網頁端運用的相對較多,其實在APP端用也非常好,因為這種形式如果第二層級分類不多,或者是第二層級信息量較少的情況下我們采用信息折疊的形式是比較好的。可以減少頁面的跳轉,用戶只需要在當前頁面獲取信息或者是在當前頁面進行篩選。
浮層引導式篩選常常用于首次進入APP的時候,幫助用戶篩選出自己感興趣的內容,之后方便后臺進行數據統計,然后根據不同用戶的喜好推送不同的內容。這樣一勞永逸的篩選形式,避免了后期不必要的麻煩。而且全屏展示能夠提供更大的展示空間。
橫條式篩選包括:橫條標尺型篩選、橫條進度條型篩選
(1)橫條標尺型篩選
上圖左一是京東金融的小白理財頁面,采用了比較新穎的標尺進行投資額的設定,用戶只需要左右滑動即可,可操作性很強,避免了用戶填寫數值的反感情緒。
(2)橫條進度條型篩選
右上圖采用了進度條的設計,用戶拖動滑塊即可確定數值,操作上沒有標尺型那樣靈活,但適合用于彈窗或者是小的模塊上。
彈窗式篩選主要分為:彈窗型篩選和底部彈窗型篩選
(1)彈窗型篩選
彈窗型的篩選一般來說還是比較少見的,通常情況下還是慎用,因為彈窗會打斷用戶瀏覽當前頁面,影響操作的連貫性。類似于這種情況呢,我就建議使用下拉彈窗式篩選或者右側抽屜式篩選效果會更好,也不會打斷用戶對整個頁面的預覽。
(2)底部彈窗型篩選
上右圖的底部彈窗式篩選這種方式通常用于底部菜單欄的操作二級篩選展示,這種就比用彈窗型篩選好很多,把對整個頁面的干擾降到最低。
填鴨式篩選通常用于多選情況比較多,當然也有單選的時候,還有填寫調查問卷或者測試題的時候。
我們可以看到上圖左的底部彈窗填鴨式篩選,右側對篩選項目進行了選中的高亮型設計,層次感非常好。這種模擬填鴨的形式模擬了真實的習題選擇,可視化較強,是一種不錯的設計形式。
我們再來看看右圖的字母選項卡填鴨式設計,這個藥品的分類就很好,同樣類似于上面嗶哩嗶哩面臨入口模塊繁雜的情況。
一般這種精細化的選擇的目標用戶是深度用戶,有明確目的性的。漫無目的的用戶不會去篩選這么復雜的操作。所以這里巧妙的結合運用了字母選項卡的設計,然后對信息入口進行了歸類整合分隔展示,整個頁面看起來更有邏輯調理。
日期篩選分為:滾動式和日歷式。
(1)滾動式篩選
日期滾動式篩選是iOS里的日期篩選特性,也是極為常見的設計形式。這種篩選形式有點像密碼鎖,操作趣味性強,降低用戶填寫數字的負面情緒。但是記得在我之前工作的時候層級采用了日期滾動式設計,在進行安卓后期的調整的時候發現開發告知我安卓沒辦法做出具有景深的滾動效果。那么視覺效果就大打折扣了。
實際上安卓的設計規范Material Design采用的是菜單原地展開,蓋住當前選項,當前選項成為菜單的第一項的設計形式。并非iOS的滾動式篩選,如下圖所示。
所以我們運用滾動式設計形式的時候,記得要考慮iOS跟安卓的平臺差異性。
(2)日歷篩選
日歷篩選是另一種日期篩選形式,這種形式適合運用在購買機票火車票,或者是期刊專題類設計的頁面上。因為有時候可能我們并不是很明確要選擇哪個日期,尤其是買飛機票我們要看不同日期的不同票價進行比對。還有期刊專題我們回顧往期期刊的時候,并不會明確的記得哪個日期沒有看。這時候就需要可視化更強的設計,日歷篩選。
右側抽屜式設計其實是比較綜合類的篩選設計,通常情況下跟下拉式彈窗設計結合使用。通常展示了不同的篩選形式,例如標簽式篩選、折疊式篩選、填鴨式篩選等等??傊斘覀冃枰故静煌Y選形式的時候推薦使用右側抽屜式篩選設計。
這里我們針對不同的使用場景總結出了十大篩選類型,分別為:標簽式篩選、左側導航式篩選、下拉式篩選、折疊式篩選、浮層引導式篩選、橫條式篩選、彈窗式篩選、填鴨式篩選、日期篩選、右側抽屜式篩選。
相信我們在以后設計篩選模塊的時候不至于束手無策了,希望本篇對您有幫助!
作者:角馬X ,口袋理財UED設計經理 公眾號:海鹽社
本文由 @角馬X 原創發布于人人都是產品經理。未經許可,禁止轉載
題圖來自Unsplash,基于CC0協議
eb爬取是從Web上收集和解析數據的過程。Python社區已經開發出一些非常強大的web爬取工具。其中,Pandas read_html()是從html表中爬取數據的一種快速方便的方法。
在本文中,你將學習Pandas read_html()來處理以下常見問題,并幫助你進行web爬取。
1.從字符串讀取表
2.從URL讀取表
3.從文件讀取表
4.使用parse_dates分析日期列
5.使用converters顯式轉換類型
6.多索引、標題和索引列
7.用match匹配表
8.使用屬性篩選表
9.使用缺失值
請檢查Notebook的源代碼(https://github.com/BindiChen/machine-learning/blob/master/data-analysis/024-pandas-read_html/pandas-read_html.ipynb)。
在第一個示例中,我們將從字符串中讀取HTML表。
html_string="""
<table>
<thead>
<tr>
<th>date</th>
<th>name</th>
<th>year</th>
<th>cost</th>
<th>region</th>
</tr>
</thead>
<tbody>
<tr>
<td>2020-01-01</td>
<td>Jenny</td>
<td>1998</td>
<td>0.2</td>
<td>South</td>
</tr>
<tr>
<td>2020-01-02</td>
<td>Alice</td>
<td>1992</td>
<td>-1.34</td>
<td>East</td>
</tr>
<tr>
<td>2020-01-03</td>
<td>Tomas</td>
<td>1982</td>
<td>1.00023</td>
<td>South</td>
</tr>
</tbody>
</table>
"""
要從字符串中讀取表,請執行以下操作:
dfs=pd.read_html(html_string)
現在,我們得到的結果不是Pandas數據幀而是Python列表。如果使用type()函數,可以看到:
>>> type(dfs)
list
如果要獲取表,可以使用索引訪問它:
dfs[0]
結果看起來很棒。讓我們看看dfs[0].info()的數據類型。默認情況下,數值列被轉換為數值類型,例如,year和cost列分別被轉換為int64和float64。
>>> df[0].info()
RangeIndex: 3 entries, 0 to 2
Data columns (total 5 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 date 3 non-null object
1 name 3 non-null object
2 year 3 non-null int64
3 cost 3 non-null float64
4 region 3 non-null object
dtypes: float64(1), int64(1), object(3)
memory usage: 248.0+ bytes
Pandas read_html()接受URL。讓我們通過一個例子來看看這是如何工作的。
URL='https://en.wikipedia.org/wiki/London'
dfs=pd.read_html(URL)
與從字符串讀取相同,它返回一個數據幀列表。如果我們運行len(dfs),我們可以從給定的URL得到31個表。
>>> print(f'Total tables: {len(dfs)}')
31
下面是dfs[6]的一個例子:
Pandas read_html()接受一個文件。讓我們通過一個例子來看看這是如何工作的。
file_path='html_string.txt'
with open(file_path, 'r') as f:
dfs=pd.read_html(f.read())
dfs[0]
注意:以下教程將從字符串中讀取數據,因為隨著時間的推移,網頁內容可能變更。
日期列作為對象數據類型讀取。要正確讀取日期列,可以使用參數parse_dates指定日期列的列表。
>>> dfs=pd.read_html(html_string, parse_dates=['date'])
>>> dfs[0].info()
RangeIndex: 3 entries, 0 to 2
Data columns (total 5 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 date 3 non-null datetime64[ns]
1 name 3 non-null object
2 year 3 non-null int64
3 cost 3 non-null float64
4 region 3 non-null object
dtypes: datetime64[ns](1), float64(1), int64(1), object(2)
memory usage: 248.0+ bytes
默認情況下,數值列被轉換為數值類型,例如,我們看到的year和cost列。但并非所有的數字文本數據都必須是數字類型,例如,所有值都以零開頭的ID列。
ID=0001
此外,有時可能需要顯式地進行類型轉換以確保數據類型的完整性。對于這些要求,我們可以使用參數轉換器顯式地進行類型轉換:
dfs=pd.read_html(html_string, converters={
'ID': str,
'year': int,
'cost': float,
})
默認情況下,位于<thead>中的<th>或<td>元素用于形成列索引,如果<thead>中包含多行,則創建一個多索引。
下面是一個在<thead>中包含多行的HTML表的示例。
html_string="""
<table>
<thead>
<tr>
<th colspan="5">Year 2020</th>
</tr>
<tr>
<th>date</th>
<th>name</th>
<th>year</th>
<th>cost</th>
<th>region</th>
</tr>
</thead>
<tbody>
<tr>
<td>2020-01-01</td>
<td>Jenny</td>
<td>1998</td>
<td>1.2</td>
<td>South</td>
</tr>
<tr>
<td>2020-01-02</td>
<td>Alice</td>
<td>1992</td>
<td>-1.34</td>
<td>East</td>
</tr>
</tbody>
</table>
"""
它創建多重索引,因為<thead>中有多行。
dfs=pd.read_html(html_string)
dfs[0]
指定標題行:
dfs=pd.read_html(html_string, header=1)
dfs[0]
指定索引列:
dfs=pd.read_html(html_string, header=1, index_col=0)
dfs[0]
參數匹配采用字符串或正則表達式。該值默認為.+(匹配任何非空字符串),并將返回所有表。
我們通過一個例子來看看這是如何工作的。
html_string="""
<table id="report">
<caption>2020 report</caption>
<thead>
<tr>
<th>date</th>
<th>name</th>
</tr>
</thead>
<tbody>
<tr>
<td>2020-01-01</td>
<td>Jenny</td>
</tr>
<tr>
<td>2020-01-02</td>
<td>Alice</td>
</tr>
</tbody>
</table>
<table>
<caption>Average income</caption>
<thead>
<tr>
<th>name</th>
<th>income</th>
</tr>
</thead>
<tbody>
<tr>
<td>Tom</td>
<td>200</td>
</tr>
<tr>
<td>James</td>
<td>300</td>
</tr>
</tbody>
</table>
"""
要讀取包含特定文本的表:
# 標題中的文本
dfs=pd.read_html(html_string, match='2020 report')
# 表格單元格中的文本
dfs=pd.read_html(html_string, match='James')
參數attrs接受任何有效的HTML標記屬性的字典來篩選表。例如:
dfs=pd.read_html(html_string, attrs={'id': 'report'})
id是有效的HTML標記屬性。
默認情況下,所有空字符串都被視為缺失值,并作為NaN讀取。
下面是一個HTML表格的示例,其中的< td >單元格中有一些空字符串。
html_string="""
<table>
<tr>
<th>date</th>
<th>name</th>
<th>year</th>
<th>cost</th>
<th>region</th>
</tr>
<tr>
<td>2020-01-01</td>
<td>Jenny</td>
<td>1998</td>
<td>1.2</td>
<td>South</td>
</tr>
<tr>
<td>2020-01-02</td>
<td>Alice</td>
<td>1992</td>
<td></td>
<td>East</td>
</tr>
<tr>
<td>2020-01-03</td>
<td>Tomas</td>
<td>1982</td>
<td></td>
<td>South</td>
</tr>
</table>
"""
以默認設置讀取。
dfs=pd.read_html(html_string)
dfs[0]
為了保留這些空字符串,我們可以將參數keep_default_na設置為False。
dfs=pd.read_html(html_string, keep_default_na=False)
有時,對于缺少的值,你可能有其他字符表示法。如果我們知道什么類型的字符用作表中的缺失值,我們可以使用na_values參數處理它們:
dfs=pd.read_html(html_string, na_values=['?', '&'])
當數據幀已經創建好后,我們可以使用pandas replace()函數來處理這些值:
df_clean=dfs[0].replace({ "?": np.nan, "&": np.nan })
Pandas read_html()函數是一種快速方便地從html表中獲取數據的方法。
我希望本文能幫助你節省從HTML表中刪除數據的時間。建議你查看read_html()API的文檔,并了解可以做的其他事情。
謝謝你的閱讀。請查看Notebook的源代碼,如果你對機器學習的實際方面感興趣,請繼續關注:https://github.com/BindiChen/machine-learning/blob/master/data-analysis/024-pandas-read_html/pandas-read_html.ipynb。
、篩選請求
Show all Content-Type:顯示所有類型Content-Type的請求,Content-Type即為響應結果header信息中Content-Type字段
Show only IMAGE/*:僅顯示響應類型為圖片的請求
Show only HTML:僅顯示響應類型為HTML的請求
Show only TEXT/CSS:僅顯示響應類型為text/css的請求
Show only SCRIPTS:僅顯示響應類型為Scripts的請求
Show only XML:僅顯示響應類型為XML的請求
Show only JSON:僅顯示響應類型為Json的請求
Hide IMAGE/*:隱藏所有響應類型為圖片的請求
二、修改請求參數之臨時修改參數
三、斷點修改請求參數
四、通過Composer修改參數
五、修改請求參數之永久修改參數,FiddlerScript修改參數
六、修改請求腳本代碼
if (oSession.HTTPMethodIs("POST") && oSession.uriContains("example.com")) {
// 獲取請求的 Body 數據
var requestBody=oSession.GetRequestBodyAsString();
// 解析 JSON
var json=Fiddler.WebFormats.JSON.JsonDecode(requestBody);
// 修改 JSON 參數
json.JSONObject["Body"]["kwy"]="value";
// 刪除 JSON 參數
json.JSONObject.Remove('key');
json.JSONObject["Body"].Remove("key");
// 將修改后的 JSON 轉換回字符串
var modifiedRequestBody=Fiddler.WebFormats.JSON.JsonEncode(json.JSONObject);
// 更新請求的 Body 數據
oSession.utilSetRequestBody(modifiedRequestBody);
}
if (oSession.HTTPMethodIs("POST") && oSession.uriContains("example.com")) {
// 獲取請求的 Body 數據
var requestBody=oSession.GetRequestBodyAsString();
// 修改參數
requestBody=requestBody.replace("param1=value1", "param1=newValue");
// 更新請求的 Body 數據
oSession.utilSetRequestBody(requestBody);
}
if (oSession.HTTPMethodIs("GET") && oSession.uriContains("example.com")) {
// 獲取請求的 URL
var url=oSession.fullUrl;
// 修改參數
url=url.replace("param1=value1", "param1=newvalue");
// 更新請求的 URL
oSession.fullUrl=url;
}
import System.Web;
if (oSession.HTTPMethodIs("GET") & & oSession.uriContains("example.com")) {
// 獲取請求的 URL
var url=oSession.fullUrl;
// 解析 URL 中的參數
var uri=new System.Uri(url);
var queryString=System.Web.HttpUtility.ParseQueryString(uri.Query);
// 刪除指定的參數
queryString.Remove("dt");
// 構建新的 URL
var newUrl=uri.GetLeftPart(System.UriPartial.Path) + "?" + queryString.ToString();
// 更新請求的 URL
oSession.fullUrl=newUrl;
}
if (oSession.HTTPMethodIs("GET") && oSession.uriContains("example.com")) {
// 獲取請求的頭部對象
var headers=oSession.oRequest.headers;
// 修改頭部的值
headers["key"]="value";
// 刪除指定的頭部
headers.Remove("key");
}
if (oSession.HTTPMethodIs("GET") && oSession.uriContains("example.com")) {
// 獲取請求的 Cookie 值
var cookieValue=oSession.oRequest["Cookie"];
// 添加cookie
cookieValue+=";key=value";
// 修改cookie
cookieValue=cookieValue.Replace("key=value", "key=newValue");
// 刪除cookie
cookieValue=cookieValue.Replace("key=value", "");
oSession.oRequest["Cookie"]=cookieValue
}
if (oSession.HTTPMethodIs("GET") && oSession.uriContains("example.com")) {
// 獲取請求的 Cookie 值
var cookieValue=oSession.oRequest["Cookie"];
var pattern="key=([^&]*)";
var regex=new System.Text.RegularExpressions.Regex(pattern);
var cookieValue=regex.Replace(cookieValue, "key=newValue");
oSession.oRequest["Cookie"]=cookieValue
}
FiddlerApplication.Log.LogString("cookie: " + cookieValue);
*請認真填寫需求信息,我們會在24小時內與您取得聯系。