关于一级域名的含义请自行查询,这里不再详述

下面直接上代码

#! /usr/bin/env python

# -*- coding: UTF-8 -*-
'''
Created on 2015-10-15

@author: WFJ
'''

import re
import urlparse
import traceback

#这是国家级域名后缀字符串,如果有新增加,请按照“后缀-说明"的格式添加
country_domain_names = """ad-Andorra安道尔
ae-United Arab Emirates阿联酋
af-Afghanistan阿富汗
ag-Antigua and Barbuda安提瓜和巴布达
ai-Anguilla安圭拉
al-Albania阿尔巴尼亚
am-Armenia亚美尼亚
an-Netherlands Antilles荷兰属地
ao-Angola安哥拉
aq-Antarctica南极洲
ar-Argentina阿根廷
as-American Samoa东萨摩亚
at-Austria奥地利
au-Australia澳大利亚
aw-Aruba阿鲁巴
az-Azerbaijan阿塞拜疆
ba-Bosnia Herzegovina波黑
bb-Barbados巴巴多斯
bd-Bangladesh孟加拉
be-Belgium比利时
bf-Burkina Faso布基纳法索
bg-Bulgaria保加利亚
bh-Bahrain巴林
bi-Burundi布隆迪
bj-Benin贝宁
bm-Bermuda百慕大
bn-Brunei Darussalam文莱
bo-Bolivia玻利维亚
br-Brazil巴西
bs-Bahamas巴哈马
bt-Bhutan不丹
bv-Bouvet Island布韦岛
bw-Botswana伯兹瓦纳
by-Belarus白俄罗斯
bz-Belize伯利兹
ca-Canada加拿大
cc-Cocos Islands科科斯群岛
cf-Central African Republic中非
cg-Congo刚果
ch-Switzerland瑞士
ci-Ivory Coast象牙海岸
ck-Cook Islands库克群岛
cl-Chile智利
cm-Cameroon喀麦隆
cn-China中国
co-Colombia哥伦比亚
cq-Equatorial Guinea赤道几内亚
cr-Costa Rica哥斯达黎加
cu-Cuba古巴
cv-Cape Verde佛得角
cx-Christmas Island圣诞岛(英属)
cy-Cyprus塞浦路斯
cz-Czech Republic捷克
de-Germany德国
dj-Djibouti吉布提
dk-Denmark丹麦
dm-Dominica多米尼加联邦
do-Dominican Republic多米尼加
dz-Algeria阿尔及利亚
ec-Ecuador厄瓜多尔
ee-Estonia爱沙尼亚
eg-Egypt埃及
eh-Western Sahara西萨摩亚
es-Spain西班牙
et-Ethiopia埃塞俄比亚
ev-El Salvador萨尔瓦多
fi-Finland芬兰
fj-Fiji斐济
fk-Falkland Islands福克兰群岛
fm-Micronesia密克罗尼西亚
fo-Faroe Islands法罗群岛
fr-France法国
ga-Gabon加蓬
gb-Great Britain (UK)大不列颠联合王国
gd-Grenada格林纳达
ge-Georgia格鲁吉亚
gf-French Guiana法属圭亚那
gh-Ghana加纳
gi-Gibraltar直布罗陀
gl-Greenland格陵兰群岛
gm-Gambia冈比亚
gn-Guinea几内亚
gp-Guadeloupe瓜德罗普岛(法属)
gr-Greece希腊
gt-Guatemala危地马拉
gu-Guam关岛
gw-Guinea-Bissau几内亚比绍
gy-Guyana圭亚那
hk-Hong Kong香港
hm-Heard 赫德与麦克唐纳群岛
hn-Honduras洪都拉斯
hr-Croatia克罗地亚
ht-Haiti海地
hu-Hungary匈牙利
id-Indonesia印度尼西亚
ie-Ireland爱尔兰
il-Israel以色列
in-India印度
io-British Indian Ocean Territory英属印度洋领地
iq-Iraq伊拉克
ir-Iran伊朗
is-Iceland冰岛
it-Italy意大利
jm-Jamaica牙买加
jo-Jordan约旦
jp-Japan日本
ke-Kenya肯尼亚
kg-Kyrgyz Stan吉尔吉斯斯坦
kh-Cambodia柬埔塞
ki-Kiribati基里巴斯
km-Comoros科摩罗
kn-St. Kitts 圣基茨和尼维斯
kp-Korea-North朝鲜
kr-Korea-South韩国
kw-Kuwait科威特
ky-Cayman Islands开曼群岛(英属)
kz-Kazakhstan哈萨克斯坦
la-Lao People's Republic老挝
lb-Lebanon黎巴嫩
lc-St. Lucia圣露西亚岛
li-Liechtenstein列支敦士登
lk-Sri Lanka斯里兰卡
lr-Liberia利比里亚
ls-Lesotho莱索托
lt-Lithuania立陶宛
lu-Luxembourg卢森堡
lv-Latvia拉脱维亚
ly-Libya利比亚
ma-Morocco摩洛哥
mc-Monaco摩纳哥
md-Moldova摩尔多瓦
mg-Madagascar马达加斯加
mh-Marshall Islands马绍尔群岛
ml-Mali马里
mm-Myanmar缅甸
mn-Mongolia蒙古
mo-Macao澳门
mp-Northern Mariana Islands北马里亚纳群岛
mq-Martinique马提尼克岛(法属)
mr-Mauritania毛里塔尼亚
ms-Montserrat蒙塞拉特岛
mt-Malta马尔他
mv-Maldives马尔代夫
mw-Malawi马拉维
mx-Mexico墨西哥
my-Malaysia马来西亚
mz-Mozambique莫桑比克
na-Namibia纳米比亚
nc-New Caledonia新喀里多尼亚
ne-Niger尼日尔
nf-Norfolk Island诺福克岛
ng-Nigeria尼日利亚
ni-Nicaragua尼加拉瓜
nl-Netherlands荷兰
no-Norway挪威
np-Nepal尼泊尔
nr-Nauru瑙鲁
nt-Neutral Zone中立区
nu-Niue纽埃
nz-New Zealand新西兰
om-Oman阿曼
pa-Panama巴拿马
pe-Peru秘鲁
pf-French Polynesia法属玻利尼西亚
pg-Papua New Guinea巴布亚新几内亚
ph-Philippines菲律宾
pk-Pakistan巴基斯坦
pl-Poland波兰
pm-St. Pierre 圣皮埃尔和密克隆群岛
pn-Pitcairn Island皮特克恩岛
pr-Puerto Rico波多黎各
pt-Portugal葡萄牙
pw-Palau帕劳
py-Paraguay巴拉圭
qa-Qatar卡塔尔
re-Reunion Island留尼汪岛(法属)
ro-Romania罗马尼亚
ru-Russian Federation俄罗斯
rw-Rwanda卢旺达
sa-Saudi Arabia沙特阿拉伯
sb-Solomon Islands所罗门群岛
sc-Seychelles塞舌尔
sd-Sudan苏旦
se-Sweden瑞典
sg-Singapore新加坡
sh-St. Helena海伦娜
si-Slovenia斯洛文尼亚
sj-Svalbard 斯瓦尔巴特和扬马延岛
sk-Slovakia斯洛伐克
sl-Sierra Leone塞拉利昂
sm-San Marino圣马力诺
sn-Senegal塞内加尔
so-Somalia索马里
sr-Suriname苏里南
st-Sao Tome 圣多美和普林西比
su-USSR苏联
sy-Syrian Arab Republic叙利亚
sz-Swaziland斯威士兰
tc-Turks 特克斯和凯科斯群岛
td-Chad乍得
tf-French Southern Territories法属南半球领地
tg-Togo多哥
th-Thailand泰国
tj-Tajikistan塔吉克斯坦
tk-Tokelau托克劳群岛
tm-Turkmenistan土库曼斯坦
tn-Tunisia突尼斯
to-Tonga汤加
tp-East Timor东帝汶
tr-Turkey土耳其
tt-Trinidad 特立尼达和多巴哥
tv-Tuvalu图瓦鲁
tw-Taiwan台湾
tz-Tanzania坦桑尼亚
ua-Ukrainian SSR 乌克兰
ug-Uganda乌干达
uk-United Kingdom英国
us-United States美国
uy-Uruguay乌拉圭
va-Vatican City State梵地冈
vc-St.Vincent 圣文森特和格林纳丁斯
ve-Venezuela委内瑞拉
vg-Virgin Islands维京群岛
vn-Vietnam越南
vu-Vanuatu瓦努阿图
wf-Wallis 瓦利斯和富图钠群岛
ws-Samoa西萨摩亚
ye-Yemen也门
yu-Yugoslavia南斯拉夫
za-South Africa南非
zm-Zambia赞比亚
zr-Zaire扎伊尔
zw-Zimbabwe津巴布韦"""

#这是国际级域名后缀字符串,如果有新增加,请按照“后缀-说明"的格式添加
international_domain_names = """.com-商业机构,任何人都可以注册
.edu-教育机构
.gov-政府部门
.int-国际组织
.mil-美国军事部门
.net-网络组织,例如因特网服务商和维修商,现在任何人都可以注册
.org-非盈利组织,任何人都可以注册
.biz-商业
.info-网络信息服务组织
.pro-用于会计、律师和医生
.name-用于个人
.museum-用于博物馆
.coop-用于商业合作团体
.aero-用于航空工业
.xxx-用于成人、色情网站
.idv-用于个人"""

class SLD(object):
    """
            该方法的准确与否取决于顶级域名后缀库的完善性,目前只添加了国际级域名后缀和国家级域名后缀
    """
    def __init__(self):
        #url格式校验的正则表达式
        self.url_regex = r"^(http://|https://){0,1}[A-Za-z0-9][A-Za-z0-9\-\.]+[A-Za-z0-9]\.[A-Za-z]{2,}[\43-\176]*$"
        #顶级域名后缀字典
        self.top_domain_suffix = self.get_top_domain_suffix()

def get_top_domain_suffix(self):
        "获取顶级域名后缀"
        "将国家域名后缀、国际域名后缀以及两者的结合生成一个字典,{'.com.cn':None, '.cn':None}这种格式,这种格式可以提高查询速度"
        k_1 = map(lambda s:".%s"%s.split("-")[0], country_domain_names.split("\n"))
        k_2 = map(lambda s:s.split("-")[0], international_domain_names.split("\n"))
        mem_dict = {}.fromkeys(["%s%s"%(k2,k1) for k2 in k_2 for k1 in k_1])
        mem_dict.update({}.fromkeys(k_1))
        mem_dict.update({}.fromkeys(k_2))
        return mem_dict

def get_host(self, url):
        "获取url的host"
        host = ""
        if re.match(self.url_regex, url):
            if url.startswith("http"):
                host_port = urlparse.urlparse(url)[1]
                host = host_port.split(":")[0]
            elif "/" in url:
                host = url[:url.find("/")].split(":")[0]
            else:
                host = url
        else:
            print "[%s] not a url" %url
        return host
           
    def get_l_s_r(self, c, h):
        "返回字符串h中字符c的位置l,c右边的部分s,左边的部分r"
        l = h.rindex(c)
        s = h[l:]
        r = h[:l]
        return l,s,r

#传入参数url,返回一级域名,返回空表示url不规范

def get_second_level_domain(self, url):

try:
            second_level_domain = ""
            host = self.get_host(url)
            dot_num = host.count(".")
            #根据host中的点"."去判断host中顶级域名的结构
            if dot_num >= 2:
                dot_1,suffix_1,remainder_1 = self.get_l_s_r(".", host)
                dot_2,suffix_2,remainder_2 = self.get_l_s_r(".", remainder_1)
                #对国家与国际结合的域名后缀进行判断
                if self.top_domain_suffix.has_key(suffix_2):
                    dot_3 = remainder_2.rindex(".")
                    second_level_domain = host[dot_3+1:]
                #对国家或国际域名后缀进行判断
                elif self.top_domain_suffix.has_key(suffix_1):
                    second_level_domain = host[dot_2+1:]
                else:
                    print "['%s'] get top domain error!" %host
               
            else:
                dot_1,suffix_1,remainder_1 = self.get_l_s_r(".", host)
                #只能是国家或国际域名后缀,进行判断
                if self.top_domain_suffix.has_key(suffix_1):
                    second_level_domain = host
                else:
                    print "['%s'] get top domain error!" %host
            return second_level_domain
        
        except:
            traceback.print_exc()

#这下面是测试代码
if __name__ == '__main__':
    a = SLD()
    for u in ["https://www.sina.com.cn:80/news/1/index.html", "https://www.jd.com.cn:80", "https://www.sina.com/","www.baidu.com.cn/news/1/index.html", "news.aodun.com.cn/1/a.html", "aodun.com", "d.adf.jf.cn", "adf.adfkj","a.news.aodun.com.cn:80/1/a.html"]:
        print a.get_second_level_domain(u)

获取URL中的一级域名相关推荐

  1. js获取url中的主域名

    var url = "http://support.supermap.com.cn/DataWarehouse/WebDocHelp/iMobileLiteFor"; var do ...

  2. 用JavaScript获取URL中的参数值

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...

  3. 如何获取URL中的参数

    获取URL中的参数 1. 使用JS函数获取URL参数 使用示例 2. Angular应用中,从URL中获取参数信息的方法 使用示例 ActivatedRoute属性 1. 使用JS函数获取URL参数 ...

  4. JS获取URL中参数值(QueryString)的4种方法分享

    http://www.jb51.net/article/48942.htm JS获取URL中参数值(QueryString)的4种方法分享 作者: 字体:[增加 减小] 类型:转载 今天碰到要在一个页 ...

  5. 由laravel 5.5无法获取url中的参数引发的apache的.htaccess文件问题

    一.前言 我这边碰到的问题就是,无法获取url中的get参数.本地使用的是laravel 5.5版本.明明url里面清清楚楚的写着参数,但是你却获取不到,这感觉实在是很气很气.刚开始以为是larave ...

  6. jquery 乱码 传参_jquery获取URL中参数解决中文乱码问题的两种方法

    从A页面通过url传参到B页面时,解析url参数可以用下面两种方法: 方法一:正则分析法 function getQueryString(name) { var reg = new RegExp(&q ...

  7. 获取URL中 后面的参数值

    获取URL中& 后面的参数值 getQueryVariable (name) {let reg = new RegExp("(^|&)" + name + &quo ...

  8. react获取URL中参数

    这个问题想必很多人都会遇到过,这里我说一下怎么获取URL中的参数. react 获取URL原理: 在 react 组件的 componentDidMount 方法中打印一下 this.props,在浏 ...

  9. javaScript获取url中的参数

    var urlTools = {//获取RUL参数值getUrlParam: function(name) { /*?videoId=identification */var params = dec ...

  10. android 获取url中的参数,验证邮箱格式,截取字符串中键值对的值,String的字节长度,去空格,替换字符

    String ss="hello"; byte[] buff=ss.getBytes(); int f=buff.length; System.out.println(f); 字节 ...

最新文章

  1. 分享一段Java搞笑的代码注释
  2. H3C 交换机S6520X软件版本升级
  3. Python程序设计题解【蓝桥杯官网题库】 DAY7-基础练习
  4. linux java 生成证书_Java 制作证书(Windows 和Linux)
  5. access inner join 数据类型不匹配_用Access开发生产管理系统
  6. 为什么使用 Dubbo ? 微服务概述?传统应用的问题?
  7. 用matlab分析系统工程案例,系统工程ISMmatlab代码.doc
  8. 从没见过干净图片,英伟达AI就学会了去噪大法 | ICML论文
  9. Springboot打jar包项目无法访问jsp问题解决
  10. 万得VS腾讯QTrade:兵分两路,B端见?
  11. 车联网信息服务数据——采集合规性——行业标准解读
  12. 学术论文科研写作方法总结--针对深度学习,自然语言处理等领域
  13. 外星人显卡拓展坞支持linux,今天,你给信仰充值了么?ALIENWARE 外星人 显卡扩展坞 简单开箱...
  14. Geant4学习记录(二)B
  15. == 和 equals 的区别
  16. 一款App的开发成本是多少?
  17. 使用SQLAlchemy创建数据模型
  18. 小爱同学自定义100个音效
  19. matlab如何进行n次循环,如何实现n次循环,并将结果显示在矩阵中
  20. 张量中有关矩阵的Kronecker乘积和Khatri-Rao乘积

热门文章

  1. 2019ug最新版本是多少_UGNX将在2019年隆重发布最新版本,也是最后一个版本,让你我都想不到的是..........
  2. 科技楼里面有三间计算机教室,中学计算机网络教室管理工作总结
  3. PyCharm中英文版本切换
  4. 深度学习---之显存单位,KiB,MiB与MB区别
  5. 拼多多和酷家乐面试经历总结(已拿offer)
  6. python文件管理api_python调用有道智云API实现文件批量翻译
  7. 如何让语音芯片与功放芯片之间更好地配合让音效更好
  8. python如何输入整数求和_Python如何输入数字并求和
  9. Java程序员开发必备软件-Windows版
  10. excel转置怎么操作_Excel选择性粘贴,那些你不得不会的小技巧