将url的查询参数解析成字典对象

本文介绍两种处理URL参数的方法:一种是从URL中解析查询字符串到对象;另一种是将对象转换为URL参数格式。提供了详细的JavaScript代码示例,并推荐使用正则表达式进行匹配。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1,

这个题目不约而同的出现在了多家公司的面试题中,当然也是因为太过于典型,解决方案无非就是拆字符或者用正则匹配来解决,我个人强烈建议用正则匹配,因为url允许用户随意输入,如果用拆字符的方式,有任何一处没有考虑到容错,就会导致整个js都报错。而正则就没有这个问题,他只匹配出正确的配对,非法的全部过滤掉,简单,方便。

实现代码:

function getQueryObject(url) {
    url = url == null ? window.location.href : url;
    var search = url.substring(url.lastIndexOf("?") + 1);
    var obj = {};
    var reg = /([^?&=]+)=([^?&=]*)/g;
    search.replace(reg, function (rs, $1, $2) {
        var name = decodeURIComponent($1);
        var val = decodeURIComponent($2);               
        val = String(val);
        obj[name] = val;
        return rs;
    });
    return obj;
}
 
getQueryObject("http://www.cnblogs.com/leee/p/4456840.html?name=1&dd=ddd**")
Object {name: "1", dd: "ddd**"}

2,将对象转化成url参数。fetch

function param(a) {
    var s = [], rbracket = /\[\]$/,
        isArray = function (obj) {
            return Object.prototype.toString.call(obj) === '[object Array]';
        }, add = function (k, v) {
            v = typeof v === 'function' ? v() : v === null '' : v === undefined ? '' : v;
            s[s.length] = encodeURIComponent(k) + '=' + encodeURIComponent(v);
        }, buildParams = function (prefix, obj) {
            var i, len, key;
 
            if (prefix) {
                if (isArray(obj)) {
                    for (i = 0, len = obj.length; i < len; i++) {
                        if (rbracket.test(prefix)) {
                            add(prefix, obj[i]);
                        else {
                            buildParams(prefix + '[' + (typeof obj[i] === 'object' ? i : '') + ']', obj[i]);
                        }
                    }
                else if (obj && String(obj) === '[object Object]') {
                    for (key in obj) {
                        buildParams(prefix + '[' + key + ']', obj[key]);
                    }
                else {
                    add(prefix, obj);
                }
            else if (isArray(obj)) {
                for (i = 0, len = obj.length; i < len; i++) {
                    add(obj[i].name, obj[i].value);
                }
            else {
                for (key in obj) {
                    buildParams(key, obj[key]);
                }
            }
            return s;
        };
 
    return buildParams('', a).join('&').replace(/%20/g, '+');
}


用到此方法  

3  $.param和上述param方法一样

decodeURIComponent($.param(defaults))
var defaults={
_c:'resource_hub_reports',
_l:3,
_log:JSON.stringify({s0:1})
}
var url = 'http://log.17zuoye.net/log?'+decodeURIComponent($.param(defaults));

来源:http://www.cnblogs.com/leee/p/5206848.html




<think>好的,用户现在问的是是否需要将复制的cookies参数转换字典才能在Scrapy中使用。我需要先回顾之前提供的关于在Scrapy中使用cookies的方法,特别是手动设置的部分。 用户之前已经得到了关于手动和自动管理cookies的详细说明,包括如何从浏览器复制cookies并转化为字典的步骤。现在他们可能在使用过程中遇到了问题,或者不确定为什么需要转换,或者是否有其他方法可以直接使用复制的字符串而不转换。 首先,我需要确认Scrapy的Request对象是否接受字符串形式的cookies。查阅Scrapy文档,发现Request的cookies参数可以接受字典或列表形式的cookies。但用户通常从浏览器复制的是分号分隔的字符串,比如"name1=value1; name2=value2"。直接传递这个字符串可能不会正确解析,因为Scrapy期望的是字典结构。因此,需要转换才能确保每个键值对被正确识别。 接下来,用户可能想知道是否有快捷方法或者内置函数可以自动转换,而不需要手动处理。例如,Scrapy是否提供工具函数来解析cookies字符串。根据我的知识,Scrapy并没有内置这样的函数,但Python的标准库或常用方法可以轻松处理,比如用split(';')分割字符串,再分解每个键值对。 另外,用户可能关心是否有其他方式传递cookies而不需要显式转换,比如通过headers参数设置Cookie头。这时候需要说明,虽然可以通过headers={'Cookie': 'name1=value1;...'}来设置,但这与使用cookies参数的效果相同,而且可能需要处理额外的格式问题,比如空格或特殊字符。 还需要提到潜在的问题,比如当cookies字符串中包含过期时间、路径等属性时,这些可能不需要包含在请求的cookies字典中,因为Scrapy主要关注的是发送到服务器的键值对,而不是其他属性。因此,转换时需要过滤掉这些非必要的部分,只保留name=value对。 此外,用户可能对自动管理cookies的情况有疑问,比如在FormRequest登录后,是否还需要手动处理cookies。这时候需要强调自动模式下中间件会处理cookie的存储和发送,用户不需要手动转换或设置,只需确保登录流程正确。 总结用户的问题,核心在于理解为什么需要转换以及如何高效地转换。需要给出明确的步骤,说明转换的必要性,并提供多种方法(手动处理、工具函数)来满足不同用户的需求。同时,提醒注意事项,比如处理特殊字符、过滤多余属性等,确保用户在实际操作中不会出错。 可能还需要对比手动设置cookies字典和使用headers设置Cookie头的区别,指出使用cookies参数更符合Scrapy的设计,能避免一些常见的错误,比如格式错误或遗漏分隔符。 最后,给出示例代码,展示如何从复制的字符串转换为字典,以及直接使用headers的情况,帮助用户更直观地理解不同方法的应用场景和实现方式。</think>在 Scrapy 中使用复制的 Cookies 时**必须转换为字典格式**才能被正确识别。以下是完整的技术解析和操作指南: --- ### 一、为何必须转换? 1. **底层机制** Scrapy 的 `Request` 对象只接受两种格式: - `dict` 类型:`{'name1': 'value1', 'name2': 'value2'}` - `list` 类型:`[{'name': '...', 'value': '...'}, ...]` 2. **浏览器原始格式问题** 直接复制浏览器的 Cookie 字符串(如 `name1=value1; path=/; domain=.example.com`)包含以下无效内容: - 路径 (`path`)、域 (`domain`) 等元数据 - 分号和空格分隔符 --- ### 二、转换方法对比 #### 方法 1:手动筛选(推荐) ```python # 原始 Cookie 字符串(从浏览器复制) raw_cookie = "session_id=a1b2c3; token=xyz987; path=/; HttpOnly" # 转换为字典(仅保留有效键值对) cookies = { 'session_id': 'a1b2c3', 'token': 'xyz987' # 过滤 path/HttpOnly 等非必要属性 } ``` #### 方法 2:自动化工具(处理复杂场景) ```python from scrapy.utils.cookies import dict_from_cookiejar import requests # 通过 requests 自动解析(处理特殊符号) raw_str = "name=val%20ue; age=25" # 含 URL 编码的 Cookie jar = requests.cookies.RequestsCookieJar() for chunk in raw_str.split(';'): key, val = chunk.strip().split('=', 1) jar.set(key, val) # 最终转换结果 cookies_dict = dict_from_cookiejar(jar) # {'name': 'val ue', 'age': '25'} ``` --- ### 三、错误用法示范 #### ❌ 直接传递字符串 ```python # 错误代码(会导致 Cookie 未被识别) yield Request( url, cookies="name=value; token=abc", # 字符串格式无效 callback=... ) ``` #### ❌ 错误转换方式 ```python # 错误:未处理 URL 编码 raw = "user=hello%20world" cookies = {k:v for k,v in [pair.split('=') for pair in raw.split(';')]} # 结果 {'user': 'hello%20world'} → 需手动解码 ``` --- ### 四、特殊场景处理 #### 1. 含过期时间的 Cookie ```python # 原始字符串包含过期时间 raw = "id=123; expires=Thu, 01 Jan 2024 00:00:00 GMT" # 转换时直接忽略 expires cookies = {'id': '123'} # 服务器不校验过期时间 ``` #### 2. 带签名或加密的 Cookie ```python # 示例:JWT 格式 raw = "auth=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.xxxx" # 保持原样传递 cookies = {'auth': 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.xxxx'} ``` --- ### 五、验证技巧 在开发过程中添加调试代码: ```python class CookieDebugSpider(scrapy.Spider): def start_requests(self): yield Request( url, cookies=cookies_dict, meta={'handle_httpstatus_all': True}, callback=self.parse_debug ) def parse_debug(self, response): # 查看实际发送的 Cookie self.logger.debug(f"Sent Cookies: {response.request.headers.get('Cookie')}") # 查看服务器响应(含 Set-Cookie) self.logger.debug(f"Response Cookies: {response.headers.getlist('Set-Cookie')}") ``` --- ### 六、替代方案(不推荐) 可通过 `headers` 参数直接注入原始 Cookie 字符串,但存在风险: ```python yield Request( url, headers={'Cookie': 'name=value; token=abc'}, # 绕过 Scrapy 的 Cookie 处理 ) ``` **缺点**: - 无法自动合并多域名 Cookie - 需要手动处理编码/特殊符号 - 失去 Cookie 自动续期能力 --- ### 总结建议 | 场景 | 推荐方案 | |-------|---------| | 简单 Cookie | 手动筛选转换字典 | | 含特殊符号 | 使用 `requests.cookies` 工具解析 | | 动态 Cookie | 通过 `FormRequest` 自动管理 | | 加密 Cookie | 直接传递原始键值对 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值