//urlEncode编码 + (NSString *)urlEncodeStr:(NSString *)input { NSString *charactersToEscape = @"?!@#$^&%*+,:;='\"`<>()[]{}/\\| "; NSCharacterSet *allowedCharacters = [[NSCharacterSet characterSetWithCharactersInString:charactersToEscape] invertedSet]; NSString *upSign = [input stringByAddingPercentEncodingWithAllowedCharacters:allowedCharacters]; return upSign; } //urlEncode解码 + (NSString *)decoderUrlEncodeStr: (NSString *) input { NSMutableString *outputStr = [NSMutableString stringWithString:input]; [outputStr replaceOccurrencesOfString:@"+" withString:@"" options:NSLiteralSearch range:NSMakeRange(0,[outputStr length])]; return [outputStr stringByRemovingPercentEncoding]; } 转成python代码
时间: 2023-06-18 17:03:15 浏览: 184
Python中有自带的urllib库可以进行URL编码和解码,代码如下:
```python
import urllib.parse
def urlEncodeStr(input):
charactersToEscape = "!?@#$^&%*+,:;='\"`<>()[]{}/\\| "
allowedCharacters = urllib.parse.quote(charactersToEscape, safe='')
upSign = urllib.parse.quote(input, safe=allowedCharacters)
return upSign
def decoderUrlEncodeStr(input):
outputStr = urllib.parse.unquote(input.replace("+", ""))
return outputStr
```
相关问题
weixin://dl/business/?appid=*APPID*&path=*PATH*&query=*QUERY*&env_version=*ENV_VERSION* 明文方式跳转 失败
### 微信小程序明文方式跳转解决方案
当尝试通过H5页面使用明文URL Scheme的方式跳转至微信小程序时,如果遇到跳转失败的情况,可以考虑以下几个方面来解决问题。
#### 1. 参数校验与编码
确保`appid`, `path`, `query`, 和`env_version`这些参数都按照规定进行了正确的设置和编码。特别是对于`query`部分的数据,在将其拼接到最终的URL之前应该先做一次URLEncode操作[^2]:
```javascript
let query = {
Code: "测试跳转小程序",
Url: "",
brandId: "",
userId: "",
userName: ""
};
// 将对象转换成查询字符串形式,并对其进行编码
let queryString = Object.keys(query).map(key => `${encodeURIComponent(key)}=${encodeURIComponent(query[key])}`).join('&');
let encodedQuery = encodeURIComponent(queryString);
```
#### 2. URL Scheme格式验证
确认使用的URL Scheme遵循官方文档中的标准格式。完整的URL应如下所示:
```
weixin://dl/business/?appid=<APPID>&path=<PATH>?<QUERY_STRING>
```
其中`<APPID>`代表目标小程序的应用ID;`<PATH>`是要打开的小程序页面路径;而`<QUERY_STRING>`则是经过编码后的查询参数串。
#### 3. 用户交互处理
考虑到用户体验以及可能存在的安全提示框干扰因素,建议在实际开发过程中加入适当的逻辑判断以应对不同情况下的用户行为响应[^1]。例如可以在点击按钮前给出明确的操作指引说明,告知用户即将发生的动作及其目的。
#### 4. 测试环境配置
如果是处于调试阶段的话,请注意检查当前所处的是正式版还是体验版(`env_version`),因为这会影响到具体的访问权限等问题。可以通过调整`env_version`参数值来进行相应的切换。
综上所述,要成功实现从H5页面向微信小程序的安全稳定跳转,除了保证技术细节上的准确性之外,还需要充分考虑到各种可能出现的实际应用场景变化所带来的影响。
优化这段代码:import requests import pandas as pd from bs4 import BeautifulSoup from lxml import etree import time import pymysql from sqlalchemy import create_engine from urllib.parse import urlencode # 编码 URL 字符串 start_time = time.time() #计算程序运行时间 def get_one_page(i): try: headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36' } paras = {'reportTime': '2023-03-23', #可以改报告日期,比如2018-6-30获得的就是该季度的信息 'pageNum': i #页码 } url = 'http://s.askci.com/stock/a/?' + urlencode(paras) response = requests.get(url,headers = headers) if response.status_code == 200: return response.text return None except RequestException: print('爬取失败') def parse_one_page(html): soup = BeautifulSoup(html,'lxml') content = soup.select('#myTable04')[0] #[0]将返回的list改为bs4类型 tbl = pd.read_html(content.prettify(),header = 0)[0] # prettify()优化代码,[0]从pd.read_html返回的list中提取出DataFrame tbl.rename(columns = {'序号':'serial_number', '股票代码':'stock_code', '股票简称':'stock_abbre', '公司名称':'company_name', '省份':'province', '城市':'city', '主营业务收入(201712)':'main_bussiness_income', '净利润(201712)':'net_profit', '员工人数':'employees', '上市日期':'listing_date', '招股书':'zhaogushu', '公司财报':'financial_report', '行业分类':'industry_classification', '产品类型':'industry_type', '主营业务':'main_business'},inplace = True) return tbl def generate_mysql(): conn = pymysql.connect( host='localhost', user='root', password='******', port=3306, charset = 'utf8', db = 'wade') cursor = conn.cursor() sql = 'CREATE TABLE IF NOT EXISTS listed_company (serial_number INT(20) NOT NULL,stock_code INT(20) ,stock_abbre VARCHAR(20) ,company_name VARCHAR(20) ,province VARCHAR(20) ,city VARCHAR(20) ,main_bussiness_income VARCHAR(20) ,net_profit VARCHAR(20) ,employees INT(20) ,listing_date DATETIME(0) ,zhaogushu VARCHAR(20) ,financial_report VARCHAR(20) , industry_classification VARCHAR(20) ,industry_type VARCHAR(100) ,main_business VARCHAR(200) ,PRIMARY KEY (serial_number))' cursor.execute(sql) conn.close() def write_to_sql(tbl, db = 'wade'): engine = create_engine('mysql+pymysql://root:******@localhost:3306/{0}?charset=utf8'.format(db)) try: tbl.to_sql('listed_company2',con = engine,if_exists='append',index=False) # append表示在原有表基础上增加,但该表要有表头 except Exception as e: print(e) def main(page): generate_mysql() for i in range(1,page): html = get_one_page(i) tbl = parse_one_page(html) write_to_sql(tbl) # # 单进程 if __name__ == '__main__': main(178) endtime = time.time()-start_time print('程序运行了%.2f秒' %endtime) # 多进程 from multiprocessing import Pool if __name__ == '__main__': pool = Pool(4) pool.map(main, [i for i in range(1,178)]) #共有178页 emdtime = time.time()-start_time print('程序运行了%.2f秒' %(time.time()-start_time))
这段代码已经很简洁了,但是可以通过以下方式进行优化:
1. 导入模块时可以将相同的模块放在一起,如将requests和pandas放在一起,将BeautifulSoup和lxml放在一起。
2. 导入模块时可以只导入需要的部分,如只导入urlencode函数。
3. 可以将函数或代码段封装成函数或类,使代码结构更清晰。
阅读全文