gpt4 book ai didi

html - 在 Golang 中提取 *html.Node 的位置偏移

转载 作者:IT王子 更新时间:2023-10-29 01:39:20 27 4
gpt4 key购买 nike

如何为已解析的 HTML 文档的特定节点提取位置偏移量?例如,对于文档 <div>Hello, <b>World!</b></div>我想知道 World! 的偏移量是15:21 .解析时文档可能会更改。

我有一个解决方案可以用特殊标记呈现整个文档,但这对性能来说真的很糟糕。有什么想法吗?

package main

import (
"bytes"
"golang.org/x/net/html"
"golang.org/x/net/html/atom"
"log"
"strings"
)

func nodeIndexOffset(context *html.Node, node *html.Node) (int, int) {
if node.Type != html.TextNode {
node = node.FirstChild
}
originalData := node.Data

var buf bytes.Buffer
node.Data = "|start|" + originalData
_ = html.Render(&buf, context.FirstChild)
start := strings.Index(buf.String(), "|start|")

buf = bytes.Buffer{}
node.Data = originalData + "|end|"
_ = html.Render(&buf, context.FirstChild)
end := strings.Index(buf.String(), "|end|")

node.Data = originalData
return start, end
}

func main() {
s := "<div>Hello, <b>World!</b></div>"
var context html.Node
context = html.Node{
Type: html.ElementNode,
Data: "body",
DataAtom: atom.Body,
}
nodes, err := html.ParseFragment(strings.NewReader(s), &context)
if err != nil {
log.Fatal(err)
}
for _, node := range nodes {
context.AppendChild(node)
}
world := nodes[0].FirstChild.NextSibling.FirstChild
log.Println("target", world)
log.Println(nodeIndexOffset(&context, world))
}

最佳答案

不是答案,但评论太长了。以下方法可能在一定程度上起作用:

  • 使用 Tokenizer 并逐个遍历每个元素。
  • 将您的输入包装到一个自定义阅读器中,该阅读器记录行和Tokenizer 从中读取的列偏移量。
  • 在调用 Next() 之前和之后查询您的自定义阅读器的位置记录您需要的大概位置信息。

这有点痛苦,而且不是准确,但可能是你能做的最好的。

关于html - 在 Golang 中提取 *html.Node 的位置偏移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34812279/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com