如何在使用html包的golang中打印css选择器之间的文本?

huangapple go评论78阅读模式
英文:

How to print text between css selectors in golang using html package?

问题

我有一个HTML文档:

<value>1,2,3</value>
 <value>,1,3,5</value>

我想使用下面的代码提取文本,但它只打印出'value'标签(CSS选择器)。如何使用Golang的html包打印标签之间的文本而不是标签本身?

z := html.NewTokenizer(b)
for {
    tt := z.Next()
    switch {
    case tt == html.ErrorToken:
        return
    case tt == html.StartTagToken:
        t := z.Token()
        isAnchor := t.Data == "value"
        if isAnchor {
            fmt.Println(t.Data)
        }
    }
}
英文:

I have html document

<value>1,2,3</value>
 <value>,1,3,5</value>

and what to extract text with code below but it only prints 'value' tags (css selectors). How to print the text from between tags instead using golang html package ?

z := html.NewTokenizer(b)
	for {
		tt := z.Next()
		switch {
		case tt == html.ErrorToken:
			return
		case tt == html.StartTagToken:
			t := z.Token()
			isAnchor := t.Data == "value"
			if isAnchor {
				fmt.Println(t.Data)
			}
		}
	}

答案1

得分: 4

这对我来说似乎有效:

r := strings.NewReader("<value>1,2,3</value><value>,1,3,5</value>")
doc, err := html.Parse(r)
if err != nil {
    log.Fatal(err)
}
var f func(*html.Node)
f = func(n *html.Node) {
    if n.Type == html.ElementNode && n.Data == "value" {
        fmt.Println(n.FirstChild.Data)
    }
    for c := n.FirstChild; c != nil; c = c.NextSibling {
        f(c)
    }
}
f(doc)

我认为关键是在找到"value"节点后获取FirstChild。

英文:

This seems to work for me:

r := strings.NewReader(&quot;&lt;value&gt;1,2,3&lt;/value&gt;&lt;value&gt;,1,3,5&lt;/value&gt;&quot;)
doc, err := html.Parse(r)
if err != nil {
	log.Fatal(err)
}
var f func(*html.Node)
f = func(n *html.Node) {
	if n.Type == html.ElementNode &amp;&amp; n.Data == &quot;value&quot; {
		fmt.Println(n.FirstChild.Data)
	}
	for c := n.FirstChild; c != nil; c = c.NextSibling {
		f(c)
	}
}
f(doc)

I think the key is grabbing the FirstChild after finding the "value" node.

答案2

得分: 1

你必须在下一个Token上使用Text()方法。

如果isAnchor := t.Data == "value"; isAnchor {
    z.Next()
    fmt.Println(z.Text())
}
英文:

You have to use Text() method on the next Token.

if isAnchor := t.Data == &quot;value&quot;; isAnchor {
    z.Next()
    fmt.Println(z.Text())
}

huangapple
  • 本文由 发表于 2016年11月22日 21:27:23
  • 转载请务必保留本文链接:https://go.coder-hub.com/40743101.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定