重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
最近在抓取一些js代码产生的动态数据,需要模拟js请求获得所需用的数据,遇到对url进行编码和解码的问题,就把遇到的问题总结一下,有总结才有进步,才能使学到的知识更加清晰。对url进行编码和解码,python提供了很方便的接口进行调用。
创新互联专注为客户提供全方位的互联网综合服务,包含不限于网站建设、成都网站建设、江西网络推广、微信小程序、江西网络营销、江西企业策划、江西品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;创新互联为所有大学生创业者提供江西建站搭建服务,24小时服务热线:13518219792,官方网址:www.cdcxhl.com
url中的query带有特殊字符(不是url的保留字)时需要进行编码。当url中带有汉字时,需要特殊的处理才能正确编码,以下都只针对这种情形,当然也适用于纯英文字符的url。
(1) url编码:
import urllib
url = 'wd=哈哈' #如果此网站编码是gbk的话,需要进行解码,从gbk解码成unicode,再从Unicode编码编码为utf-8格式。
url = url.decode('gbk', 'replace')
print urllib.quote(url.encode('utf-8', 'replace'))
结果: 3a%2f%2ftest.com%2fs%3fwd%3d%e5%93%88%e5%93%88
(2) url解码:
import urllib
encoded_url = est.com%2fs%3fwd%3d%e5%93%88%e5%93%88'
print urllib.unquote(encoded_url).decode('utf-8', 'replace').encode('gbk', 'replace') #反过来
函数调用的参数以及结果都是utf-8编码的,所以在对url编码时,需要将参数串的编码从原始编码转换成utf-8,
对url解码时,需要将解码结果从utf-8转换成原始编码格式。
依据网站采用的编码不同,或是gbk或是utf-8,赋赋予不同的编码,进行不同的url转码。GBK格式,一个中文字符转为%xx%xx,共两组;utf-8格式,一个中文字符转为%xx%xx%xx,共三组。
import sys,urllib
s = '杭州'
urllib.quote(s.decode(sys.stdin.encoding).encode('gbk'))
%BA%BC%D6%DD
urllib.quote(s.decode(sys.stdin.encoding).encode('utf8'))
'%E6%9D%AD%E5%B7%9E'
[python] view plain copy
a = "墨西哥女孩被拐4年接客4万次 生的孩子成为人质-搜狐新闻"
print urllib.quote(urllib.quote(a))
进行两次编码转换后,会变为:%25E5%25A2%25A8%25E8%25A5%25BF%25E5%2593%25A5%25E5%25A5%25B3%25E5%25AD%25A9%25E8%25A2%25AB%25E6%258B%25904%25E5%25B9.................................................................................这样的形式。
同样需要两次解码后才能得到中文。
最近用python写了个小爬虫自动下点东西,但是url 是含中文的,而且中文似乎是 gbk 编码然后转成 url的。举个例子吧,我如果有个unicode字符串“历史上那些牛人们.pdf”,那么我转换成url之后是,
t="%20%E5%8E%86%E5%8F%B2%E4%B8%8A%E9%82%A3%E4%BA%9B%E7%89%9B%E4%BA%BA%E4%BB%AC.pdf",
但是对方网站给的是 s="%C0%FA%CA%B7%C9%CF%C4%C7%D0%A9%C5%A3%C8%CB%C3%C7.PDF"
print urllib.unquote("%C0%FA%CA%B7%C9%CF%C4%C7%D0%A9%C5%A3%C8%CB%C3%C7.PDF").decode('gbk').encode('utf-8')
历史上那些牛人们.PDF
首先我们可以先获取要下载图片的整个页面信息。
getjpg.py
#coding=utf-8
import urllib
def getHtml(url):
page = urllib.urlopen(url)
html = page.read()
return html
print html
Urllib 模块提供了读取web页面数据的接口,我们可以像读取本地文件一样读取www和ftp上的数据。首先,我们定义了一个getHtml()函数:
urllib.urlopen()方法用于打开一个URL地址。
read()方法用于读取URL上的数据,向getHtml()函数传递一个网址,并把整个页面下载下来。执行程序就会把整个网页打印输出。
Python中函数参数的传递是通过“赋值”来传递的,函数参数的接收传递有四种形式:
1. F(arg1,arg2,...)
2. F(arg2=,arg3=...)
3. F(*arg1)
4. F(**arg1)
第1
种方式是最“传统”的方式:一个函数可以定义不限个数参数,参数(形式参数)放在跟在函数名后面的小括号中,各个参数之间以逗号隔开。用这种方式定义的函数在调用的时候也必须在函数名后的小括号中提供相等个数的值(实际参数),不能多也不能少,而且顺序还必须相同。也就是说形参和实参的个数必须一致,而且想给形参1的值必须是实参中的第一位,形参与实参之间是一一对应的关系,即“形参1=实参1
形参2=实参2...”。很明显这是一种非常不灵活的形式。比如:"def addOn(x,y): return x +
y",这里定义的函数addOn,可以用addOn(1,2)的形式调用,意味着形参x将取值1,主将取值2。addOn(1,2,3)和addOn
(1)都是错误的形式。
第2种方式比第1种方式好一点,在定义的时候已经给各个形参定义了默认值。因此,在调用这种函数时,如果没有给对应的形式参数传递实参,那么这个形参就将使用默认值。比如:“def
addOn(x=3,y=5): return x +
y”,那么addOn(6,5)的调用形式表示形参x取值6,y取值5。此外,addOn(7)这个形式也是可以的,表示形参x取值7,y取默认值5。这时候会出现一个问题,如果想让x取默认值,用实参给y赋值怎么办?前面两种调用形式明显就不行了,这时就要用到Python中函数调用方法的另一大绝招
──关健字赋值法。可以用addOn(y=6),这时表示x取默认值3,而y取值6。这种方式通过指定形式参数可以实现可以对形式参数进行“精确攻击”,一个副带的功能是可以不必遵守形式参数的前后顺序,比如:addOn(y=4,x=6),这也是可以的。这种通过形式参数进行定点赋值的方式对于用第1种方式定义的函数也是适用的。
上面两种方式定义的形式参数的个数都是固定的,比如定义函数的时候如果定义了5个形参,那么在调用的时候最多也只能给它传递5个实参。但是在实际编程中并不能总是确定一个函数会有多少个参数。第3种方式就是用来应对这种情况的。它以一个*加上形参名的方式表示,这个函数实际参数是不一定的,可以是零个,也可以是N个。不管是多少个,在函数内部都被存放在以形参名为标识符的tuple中。比如:
对这个函数的调用addOn() addOn(2) addOn(3,4,5,6)等等都是可以的。
与第3种方式类似,形参名前面加了两个*表示,参数在函数内部将被存放在以形式名为标识符的dictionary中。这时候调用函数必须采用key1=value1、key2=value2...的形式。比如:
1. def addOn(**arg):
2. sum = 0
3. if len(arg) == 0: return 0
4. else:
5. for x in arg.itervalues():
6. sum += x
7. return sum
那么对这个函数的调用可以用addOn()或诸如addOn(x=4,y=5,k=6)等的方式调用。
上面说了四种函数形式定义的方式以及他们的调用方式,是分开说的,其实这四种方式可以组合在一起形成复杂多样的形参定义形式。在定义或调用这种函数时,要遵循以下规则:
1. arg=必须在arg后
2. *arg必须在arg=后
3. **arg必须在*arg后
在函数调用过程中,形参赋值的过程是这样的:
首先按顺序把“arg”这种形式的实参给对应的形参
第二,把“arg=”这种形式的实参赋值给形式
第三,把多出来的“arg”这种形式的实参组成一个tuple给带一个星号的形参
第四,把多出来的“key=value”这种形式的实参转为一个dictionary给带两个星号的形参。
听起来好复杂,实际是是很简单的。很直观,来看例子:
1. def test(x,y=5,*a,**b):
2. print x,y,a,b
就这么一个简单函数,来看看下面对这个函数调用会产生什么结果:
test(1) === 1 5 () {}
test(1,2) === 1 2 () {}
test(1,2,3) === 1 2 (3,) {}
test(1,2,3,4) === 1 2 (3,4)
test(x=1) === 1 5 () {}
test(x=1,y=1) === 1 1 () {}
test(x=1,y=1,a=1) === 1 1 () {'a':1}
test(x=1,y=1,a=1,b=1) === 1 1 () {'a':1,'b':1}
test(1,y=1) === 1 1 () {}
test(1,2,y=1) === 出错,说y给赋了多个值
test(1,2,3,4,a=1) === 1 2 (3,4) {'a':1}
test(1,2,3,4,k=1,t=2,o=3) === 1 2 (3,4) {'k':1,'t':2,'o':3}
regex。用于筛选过滤url
view:用于指定特定的处理方法。就是你在view.py中定义方法
kwargs:可选参数
name:此条规则的别名。用于url 逆向查询。
另外,建议楼主自己照着官方的tutorial完整练习一遍。会比在这里问,有收获。
大数据
【python教程入门学习】用python制作url短链

梦魇java
原创
关注
0点赞·595人阅读
Hi,伙计们!今天这篇文章中我要向你展示我们如何利用python来使复杂的url变得苗条。首先明确一下,我们并不是自己做一个url缩址服务,而是要利用tinyurl api(Tinyurl可以提供缩略网址服务)。tinyurl没有发布过任何官方的的python api,所以我们从此开始:
第一步:
首先我们要进行一些调用。我们需要调用七个库来完成这项工作。
也许我们仅导入一个库就可以完成这项工作,但是为了做一个更好的url缩址,最好还是导入七个。
第二步:
现在我们开始用一种方法处理url缩址。请仔细看代码,代码很简单不言而喻。但我接下来还是会说明一下。
你理解了吗?我来给新手解释一下。首先我们定义了一个make_tiny函数,它可以把一个url作为输入。然后我们开始定义函数如何工作。url_code把一个url作为输入然后将其编码,也就是将其加密。然后我们将这个加密的url添加到tinyurl api的url尾部。我们打开request_url,使用urlopen函数。最后我们将返回值转化为utf-8,并阅读它。为什么要转化?因为urlopen函数返回的是比特流而不是字符串。所以为了打印或者修改,我们需要将其转换成字符串。很简单对吧?
下一步是从用户那里获取输入。我们使用sys库。
第三步:
让我们为我们的代码敲上main()函数。代码如下:
我们要做什么?我们在利用sys.argv来获取用户输入。我们没有限制自己只能输入一个url,而是想输入多少url就可以输入多少,然后可以把它们都缩短。sys.argv[1:]做的是除最开始两个参数(从0开始)外,将剩余的参数产生一个list。举个例子,如果你这样输入:
然后sys.argv[1:]会跳过python 和.py,然后产生下面这个list:
等等!那这个map()函数在这里做什么呢?大多数新手会感到困惑,是因为他们大多数从来没使用过map。map()是一个循环list的简单方式,把其中内容一个接一个传递给函数。上面的map()函数等价如下:
我希望上述代码已经解释清楚了关于map()函数的任何疑惑。
第四步:
现在让我们来包装我们的代码。剩下的唯一一件事就是:
把这个加到你代码的末尾。这会告诉我们什么时候脚本会被独立于shell执行,什么时候会被另一个脚本调用。如果你想在其他项目中使用这个脚本,这样做会非常方便。
最后,这是完整的代码:
如果你已经保存了这个脚本为url_shortener.py,你可以在shell中这样运行它:
如果你想保存这些tinyurls在txt文档里,就执行这行命令:
今天简单使用了一下python的re模块和lxml模块,分别利用的它们提供的正则表达式和xpath来解析页面源码从中提取所需的title,xpath在完成这样的小任务上效率非常好,在这里之所以又使用了一下正则表达式是因为xpath在处理一些特殊的页面的时候会出现乱码的情况,当然这不是xpath的原因,而是页面本身编码,跟utf-8转码之间有冲突所致,这里看代码:
python抽取指定url页面的title方法(python获取当前页面的url) python 抽取 url title 脚本之家 第1张
# !/usr/bin/python
#-*-coding:utf-8-*-
'''
功能:抽取指定url的页面内容中的title
'''
import re
import chardet
import urllib
from lxml import etree
def utf8_transfer(strs):
'''
utf8编码转换
'''
try:
if isinstance(strs, unicode):
strs = strs.encode('utf-8')
elif chardet.detect(strs)['encoding'] == 'GB2312':
strs = strs.decode("gb2312", 'ignore').encode('utf-8')
elif chardet.detect(strs)['encoding'] == 'utf-8':
strs = strs.decode('utf-8', 'ignore').encode('utf-8')
except Exception, e:
print 'utf8_transfer error', strs, e
return strs
def get_title_xpath(Html):
'''
用xpath抽取网页Title
'''
Html = utf8_transfer(Html)
Html_encoding = chardet.detect(Html)['encoding']
page = etree.HTML(Html, parser=etree.HTMLParser(encoding=Html_encoding