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
}
如果您觉得本文对您有用,欢迎捐赠或留言~
- 本博客所有文章除特别声明外,均可转载和分享,转载请注明出处!
- 本文地址:https://www.leevii.com/?p=750