golang 解析html时把url转绝对路径

golang 解析html时把url转绝对路径

在golang解析html时,常遇到img、a标签的资源地址为相对路径[…/,./]的情况,这时就需要一个方法把这些地址转换为绝对路径。

// 返回url的绝对地址
// currUrl 当前url
func absUrl(currUrl, baseUrl string) string {
	urlInfo, err := url.Parse(currUrl)
	if err != nil {
		return ""
	}
	if urlInfo.Scheme != "" {
		return currUrl
	}
	baseInfo, err := url.Parse(baseUrl)
	if err != nil {
		return ""
	}

	u := baseInfo.Scheme + "://" + baseInfo.Host
	var path string
	if strings.Index(urlInfo.Path, "/") == 0 {
		path = urlInfo.Path
	} else {
		path = filepath.Dir(baseInfo.Path) + "/" + urlInfo.Path
	}

	rst := make([]string, 0)
	pathArr := strings.Split(path, "/")

	// 如果path是已/开头,那在rst加入一个空元素
	if pathArr[0] == "" {
		rst = append(rst, "")
	}
	for _, p := range pathArr {
		if p == ".." {
			if rst[len(rst)-1] == ".." {
				rst = append(rst, "..")
			} else {
				rst = rst[:len(rst)-1]
			}
		} else if p != "" && p != "." {
			rst = append(rst, p)
		}
	}
	return u + strings.Join(rst, "/")
}
测试
func Test(t *testing.T) {
	str := "https://xxx.com/articles/2876/1.html"
	s := "../../2.html"
	s1 := "./../2.html"
	s2 := "/2.html"
	s3 := "./2.html"
	s4 := "https://xxx.com/2.html"
	println(absUrl(s, str)) // https://xxx.com/2.html
	println(absUrl(s1, str)) // https://xxx.com/articles/2.html
	println(absUrl(s2, str)) // https://xxx.com/2.html
	println(absUrl(s3, str)) // https://xxx.com/articles/2876/2.html
	println(absUrl(s4, str)) // https://xxx.com/2.html
}
Go语言中,解析URL并截图通常涉及两个主要部分:URL的获取和处理,以及屏幕抓取技术。这两个任务分别可以通过标准库和第三方库来完成。 1. 解析URLGo的`net/http`包提供了解析URL的功能。你可以使用`url.Parse()`函数将字符串换为URL结构体,以便获取其组成部分如协议、主机名、路径等。例如: ```go import ( "fmt" "net/url" ) func parseURL(urlStr string) (*url.URL, error) { u, err := url.Parse(urlStr) if err != nil { return nil, fmt.Errorf("failed to parse URL: %w", err) } return u, nil } ``` 2. 截图: 抓取屏幕内容则需要用到图形库,比如`github.com/gographics/imagick/imagick`(基于ImageMagick)或`github.com/fogleman/gg`(一个简单的绘图库)。这些库可以帮助你在Go程序中生成图片。这里给出一个基本的用法示例,假设你已经安装了相应的依赖: ```go import ( "image" "image/color" _ "github.com/gographics/imagick/imagick" ) // 使用ImageMagick进行截图(实际代码需处理初始化和资源清理) func screenshot(url *url.URL) (image.Image, error) { // 实现细节取决于具体库的API // 假设我们有一个函数handleScreenCapture img, err := handleScreenCapture(url.String()) if err != nil { return nil, fmt.Errorf("failed to capture screen: %w", err) } return img, nil } // 使用gg绘制截图(示例) func drawScreenshot(img image.Image, file string) error { d, err := gg.NewContextFromImage(img) if err != nil { return fmt.Errorf("failed to create drawing context: %w", err) } // 绘制和保存图像到文件 d.DrawImage(img) if err = d.SavePNG(file); err != nil { return fmt.Errorf("failed to save screenshot: %w", err) } return nil } ``` 请注意,这只是一个基础示例,实际操作可能会更复杂,特别是对于远程图片的抓取可能涉及到网络请求,错误处理,性能优化等问题。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值