python Beautiful Soup解析html頁面table標籤

一、緊接上文js 判斷系統類型和手機型號(廠商)

  • 上文實現了得到系統類型和手機型號了。現在手機型號有了,那麼有一個需求:功能是分辨訪問用戶的手機類型(安卓、IOS),然後跳轉對應頁面。最好能分清楚用戶的手機廠商型號(華爲、小米、oppo、vivo)等,然後分別調各自的應用商店。
  • iOS倒也無所謂判斷了系統類型後直接到蘋果應用商店就行了(反正就一個應用商店);Android的話就要稍微麻煩一點了,要判斷不同廠商跳轉不同的應用商店(比如小米的就跳小米的應用商店)。
  • 爲了實現這一需求我把型號寫個model.js存放起來,裏面一個Map數據結構,存儲每個手機型號要跳轉的頁面(因爲前面我們已經實現了得到手機型號了,所以這樣寫的)。
//省略前面部分
............
if (os == "iOS") {//ios系統的處理
        os = md.os() + md.version("iPhone");
        model = md.mobile();
        window.location.href = iosShop.get('default');
    } else if (os == "AndroidOS") {//Android系統的處理
        os = md.os() + md.version("Android");
        var sss = device_type.split(";");
        var i = sss.contains("Build/");
        if (i > -1) {
            model = sss[i].substring(0, sss[i].indexOf("Build/"));
        }
        var locationHref = "";
        //alert(model + "--" +androidShop.has(model));
        if(null != model && "" != model && "undefined" != typeof(model) &&  androidShop.has(trim(model))){
            locationHref = androidShop.get(trim(model));
        }else {
            //默認的地址
            locationHref = androidShop.get("default");
        }
        window.location.href = locationHref;
    }
............
//省略後面部分

這裏寫圖片描述

  • 現在還有一個大問題是沒有廠商型號的數據,這是個大問題。好在我百度了下小米的userAgent意外的搜索到了這個 fynas實用小工具
    這裏寫圖片描述
    這裏的User-Agent正是我想要的,但是我要是用一個個複製粘貼實在太慢了。還是寫點代碼,解析html靠譜點。於是就用了Beautiful Soup。

二、Beautiful Soup安裝和使用

$ easy_install beautifulsoup4
或者
$ pip install beautifulsoup4

另外我這裏還用到了requests庫,可在這裏下載 requests下載,github裏面也有的。

  • 首先使用requests庫訪問頁面得到html,再用Beautiful Soup去解析html,得到整個table。
 headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'};
    result = requests.post(url, data={}, verify=False);
    # print(result.text);

    # 初始化並指定解析器
    soup = BeautifulSoup(result.text, "lxml");
    # 得到table
    table = soup.table;
  • 然後就是得到全部tr標籤,查詢所有td,td我們要的是第4列User-Agent字符串,也就是td數組3,然後排除”User-Agent字符串”也就是沒頁的第一行,最後就是截取字符串得到手機型號的操作了。
tr_arr = table.find_all("tr");
    for tr in tr_arr:
        # //查詢所有td
        tds = tr.find_all('td');
        # for  td in tds:
        # 得到User-Agent字符串
        # print(tds[3].get_text());
        userAgent = tds[3].get_text();
        if "User-Agent字符串" != userAgent :
            user_agent_build = userAgent.split("Build/")[0];
            user_agent_arr = user_agent_build.split(";");
            phoneModel = user_agent_arr[len(user_agent_arr) - 1];
            print(phoneModel.strip());
  • 完整的代碼(完整代碼我把要加的js代碼手機型號寫入了文件):
# -*- coding: utf-8 -*-

'''
抓取 user-agent
文檔 https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html#id10
zhouzhongqing
2018年7月10日22:06:48
'''

import requests;
from bs4 import BeautifulSoup


# 寫入文件
def write_to_file(file_name, txt):
    '''''
        講txt文本存入到file_name文件中
    '''
    print("正在存儲文件" + str(file_name));
    # 1 打開文件
    # w 如果沒有這個文件將創建這個文件
    '''
    'r':讀

    'w':寫

    'a':追加

    'r+' == r+w(可讀可寫,文件若不存在就報錯(IOError))

    'w+' == w+r(可讀可寫,文件若不存在就創建)

    'a+' ==a+r(可追加可寫,文件若不存在就創建)
    '''
    f = open(file_name, 'a+', encoding='utf-8');
    # 2 讀寫文件
    f.write(str(txt));
    # 3 關閉文件
    f.close();


'''
發起請求
@:param url
'''

#爲了去重
userAgentList = [];


def requestUserAgent(url):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'};
    result = requests.post(url, data={}, verify=False);
    # print(result.text);

    # 初始化並指定解析器
    soup = BeautifulSoup(result.text, "lxml");
    # 得到table
    table = soup.table;
    # print(table);
    tr_arr = table.find_all("tr");
    for tr in tr_arr:
        # //查詢所有td
        tds = tr.find_all('td');
        # for  td in tds:
        # 得到User-Agent字符串
        # print(tds[3].get_text());
        userAgent = tds[3].get_text();
        if "User-Agent字符串" != userAgent :
            user_agent_build = userAgent.split("Build/")[0];
            user_agent_arr = user_agent_build.split(";");
            phoneModel = user_agent_arr[len(user_agent_arr) - 1];
            print(phoneModel.strip());
            #排重
            if phoneModel.strip() not in userAgentList:
                write_to_file("d:/vivo.txt","androidShop.set(\""+phoneModel.strip()+"\",vivoDownloadAddress);\n")
                userAgentList.append(phoneModel.strip());


if __name__ == '__main__':
    print("start");
    '''
    userAgent = "Mozilla/5.0 (Linux; Android 6.0; vivo Y67A Build/MRA58K) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/35.0.1916.138 Mobile Safari/537.36 T7/7.4 baiduboxapp/8.5 (Baidu; P1 6.0)";
    user_agent_build = userAgent.split("Build/")[0];
    user_agent_arr = user_agent_build.split(";");
    phoneModel = user_agent_arr[len(user_agent_arr) - 1];
    print(phoneModel.strip())
    '''

    for i in range(1, 83):
         print("這是第"+str(i)+"頁");
         #vivo的機型
         requestUserAgent("http://www.fynas.com/ua/search?b=&d=vivo&page="+str(i));

    '''
    for i in range(1, 84):
        print("這是第" + str(i) + "頁");
        # 小米的機型
        requestUserAgent("http://www.fynas.com/ua/search?d=%E5%B0%8F%E7%B1%B3&b=&page=" + str(i));
    '''

    print("end");
  • 得到的vivo的手機型號
    這裏寫圖片描述
    大致就是這樣了,要得到其他機型,就再加for循環,拼接URL來做就差不多了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章