Golang golang.org/x/net/html 包的使用:查找节点内容

需求:解析html代码,样例如下:

<html>
	<body>
		<div id="newlist_1">
			<a id="newlist_1" href="https://example.com">Link 1</a>
		</div>
		<div id="newlist_2">
			<a id="newlist_2" href="https://example.com">Link 2</a>
		</div>
	</body>
</html>

找出:id=newlist_1 下面的节点

package main

import (
	"fmt"
	"strings"

	"golang.org/x/net/html"
)

func findNodeByID(node *html.Node, id string) *html.Node {
	if node.Type == html.ElementNode && node.Data == "a" {
		for _, attr := range node.Attr {
			if attr.Key == "id" && attr.Val == id {
				return node
			}
		}
	}

	for child := node.FirstChild; child != nil; child = child.NextSibling {
		found := findNodeByID(child, id)
		if found != nil {
			return found
		}
	}

	return nil
}

func main() {
	htmlString := `<html>
	<body>
		<div id="newlist_1">
			<a id="newlist_1" href="https://example.com">Link 1</a>
		</div>
		<div id="newlist_2">
			<a id="newlist_2" href="https://example.com">Link 2</a>
		</div>
	</body>
</html>`

	reader := strings.NewReader(htmlString)
	doc, err := html.Parse(reader)
	if err != nil {
		fmt.Println("HTML parsing error:", err)
		return
	}

	node := findNodeByID(doc, "newlist_1")
	if node != nil {
		fmt.Println("Found node:", node.FirstChild.Data)
	} else {
		fmt.Println("Node not found")
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在最新版本的 Go 中,`golang.org/x/net/websocket` 已经被废弃,推荐使用官方提供的 `github.com/gorilla/websocket` 来处理 WebSocket 连接。以下是一个简单示例,演示如何使用 `github.com/gorilla/websocket` 进行 WebSocket 通信: ```go package main import ( "log" "net/http" "github.com/gorilla/websocket" ) var upgrader = websocket.Upgrader{ CheckOrigin: func(r *http.Request) bool { return true }, } func main() { http.HandleFunc("/ws", handleWebSocket) log.Fatal(http.ListenAndServe(":8080", nil)) } func handleWebSocket(w http.ResponseWriter, r *http.Request) { conn, err := upgrader.Upgrade(w, r, nil) if err != nil { log.Println("WebSocket 连接升级失败:", err) return } defer conn.Close() for { // 读取消息 _, msg, err := conn.ReadMessage() if err != nil { log.Println("WebSocket 读取消息失败:", err) break } log.Printf("收到 WebSocket 消息:%s\n", msg) // 处理消息 // ... // 发送响应 err = conn.WriteMessage(websocket.TextMessage, []byte("收到消息")) if err != nil { log.Println("WebSocket 发送响应失败:", err) break } } } ``` 在上述示例中,我们首先创建了一个 `websocket.Upgrader` 对象,并设置了其中的 `CheckOrigin` 函数以允许跨域请求。然后我们定义了一个 `handleWebSocket` 函数,用于处理 WebSocket 连接。 在 `handleWebSocket` 函数中,我们通过 `upgrader.Upgrade` 方法将 HTTP 连接升级为 WebSocket 连接。然后,我们进入一个循环来处理收到的消息。您可以在循环中添加您自己的消息处理逻辑,并通过 `conn.WriteMessage` 方法发送响应。 请注意,这只是一个简单的示例,您可能需要根据您的实际需求进行适当的配置和错误处理。 希望以上信息对您有所帮助!如果您还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值