URL简介
URL是Uniform Resource Locator的简写,统一资源定位符
一个url由以下几部分组成
scheme://host.port/path/?query-string=xxx&anchor
- scheme: 代表访问的协议,一般为http、ftp或https等
- host: 代表主机号,域名,例如: www.baidu.com
- port: 代表端口号,访问网站默认为80端口
- path: 代表查找路径
- query-string: 代表查询字符串
- anchor: 锚点,一般前端用来做页面定位
代码演示使用ipython,关于ipython
URL切割
- urllib.parse.urlparse
In [1]: import urllib
In [2]: urllib.parse.urlparse("https://www.baidu.com/s?user=test")
Out[2]: ParseResult(scheme='https', netloc='www.baidu.com', path='/s', params='', query='user=test', fragment='')
In [3]: type(urllib.parse.urlparse("https://www.baidu.com/s?user=test"))
Out[3]: urllib.parse.ParseResult
In [4]: urllib.parse.urlparse("https://www.baidu.com/s?user=test").scheme
Out[4]: 'https'
In [5]: type(urllib.parse.urlparse("https://www.baidu.com/s?user=test").scheme)
Out[5]: str
- 正确使用
# 只有域名
In [16]: urllib.parse.urlparse("www.baidu.com")
Out[16]: ParseResult(scheme='', netloc='', path='www.baidu.com', params='', query='', fragment='')
- 错误使用
暂定
- urllib.parse.urlsplit
In [1]: import urllib
In [2]: urllib.parse.urlsplit("https://www.baidu.com/s?user=test")
Out[2]: SplitResult(scheme='https', netloc='www.baidu.com', path='/s', query='user=test', fragment='')
In [13]: type(urllib.parse.urlsplit("https://www.baidu.com/s?user=test"))
Out[13]: urllib.parse.SplitResult
In [14]: urllib.parse.urlsplit("https://www.baidu.com/s?user=test").scheme
Out[14]: 'https'
In [15]: type(urllib.parse.urlsplit("https://www.baidu.com/s?user=test").scheme)
Out[15]: str
- 正确使用
# 只有域名
In [18]: urllib.parse.urlsplit("www.baidu.com")
Out[18]: SplitResult(scheme='', netloc='', path='www.baidu.com', query='', fragment='')
- 错误使用
暂定
- 使用正则分隔符在字符串中提取url
正则表达式 | 描述 |
---|---|
? | 匹配之前的项的1次或0次 |
[] | 匹配在[字符]之中的任意字符 |
\d | 相当[0-9] |
{n} | 匹配之前的项n次 |
+ | 匹配之前的项1次或多次 |
| | 指明两项之间的一个选择 |
\w | 包含大小写字母数字和下划线 相当于([0-9a-zA-Z]) |
. | 匹配除换行符 \n 之外的任何单字符。 |
用圆括号将所有选择项括起来,相邻的选择项之间用|分隔。但用圆括号会有一个副作用,使相关的匹配会被缓存,此时可用?:放在第一个选项前来消除这种副作用。其中 ?: 是非捕获元之一
In [19]: import re
In [20]: string = 'Runoob 的网页地址为:https://www.runoob.com,Google 的网页地址为:https://www.google.com'
In [21]: re.findall('https?://(?:[-\w.]|(?:%[\da-fA-F]{2}))+', string)
Out[21]: ['https://www.runoob.com', 'https://www.google.com']
- 判断一个字符串是否是URL
- 判断该url是否有IP地址返回
In [22]: import socket
In [23]: socket.gethostbyname("www.baidu.com")
Out[23]: '220.181.38.149'
- 错误使用
In [24]: socket.gethostbyname("https://www.baidu.com")
---------------------------------------------------------------------------
gaierror Traceback (most recent call last)
<ipython-input-24-da327ed90c22> in <module>
----> 1 socket.gethostbyname("https://www.baidu.com")
gaierror: [Errno 11001] getaddrinfo failed