url绝对路径处理

之前写过一个php版本的爬虫,其中有一个对路径的处理,即相对路径转化为绝对路径,可以在这里查看

今天用nodejs爬虫时,又js重新对其实现了一次,和之前的实现方式有些不同。

这里使用了url模块对url链接进行解析,使用npm install --save url进行安装。

详见代码

var _url = require('url')

function array_remove_null(array) {
    for (var i = 0; i < array.length; i++) {
        if (array[i] === '') {
            array.splice(i, 1)
            i--
        }
    }
    return array
}

/**
 * 路径处理
 * @param {string} url 待解析的url
 * @param {string} cur_url 来源页面url
 */
function format_path(url, cur_url) {
    cur_url = cur_url || init_base_url
    var cur_url_parse = _url.parse(cur_url)
    var cur_host = cur_url_parse.host
    var cur_port = cur_url_parse.port
    var cur_protocol = cur_url_parse.protocol
    var cur_hostname = cur_url_parse.hostname
    var cur_pathname = cur_url_parse.pathname
    var cur_pathname_objs = array_remove_null(cur_pathname.split('/'))
    var cur_url_base_path = ''
    if (cur_pathname[cur_pathname.length - 1] === '/')
        cur_url_base_path = '/' + cur_pathname_objs.join('/') + '/'
    else
        cur_url_base_path = '/' + cur_pathname_objs.splice(0, cur_pathname_objs.length - 1).join('/') + '/'
    var cur_base_url = cur_protocol + "//" + cur_hostname + (cur_port ? ':' + cur_port : '') + cur_url_base_path
    //形如 /about.html
    if (url[0] === "/")
        return init_base_url + url
    var url_parse = _url.parse(url)
    //形如 http://www.baidu.com
    if (url_parse.protocol && url_parse.hostname) return url
    var url_objs = url.split('/')
    //形如 about/abc.html
    if (!url_parse.protocol && !url_parse.hostname && url_parse.pathname && url_objs[0] !== '.' && url_objs[0] != '..')
        return cur_url + "/" + url
    //形如 ../../a/c/v/a.html
    if (url_objs[0] === '.')
        url = url.substring(2)
    url_objs = url.split('/')
    var cur_url_pathname = cur_url_base_path
    var cur_main_url = cur_url.split(cur_url_pathname)[0]
    var cur_url_objs = array_remove_null(cur_url_pathname.split('/'))
    var url_after = []
    for (var i = 0; i < url_objs.length; i++) {
        if (url_objs[i] === '..') {
            cur_url_objs.splice(cur_url_objs.length - 1, 1)
        } else {
            url_after.push(url_objs[i])
        }
    }
    cur_url_pathname = (cur_url_objs.length > 0) ? ('/' + cur_url_objs.join('/')) : ''
    var url_after_pathname = (url_after.length > 0) ? ('/' + url_after.join('/')) : ''
    return cur_main_url + cur_url_pathname + url_after_pathname
}
如果您觉得本文对您有用,欢迎捐赠或留言~
微信支付
支付宝

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注