2016-11-22 58 views
0

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

<value>1,2,3</value> 
<value>,1,3,5</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) 
      } 
     } 
    } 
+1

是你正在寻找的'Text()'方法吗? https://godoc.org/golang.org/x/net/html#Tokenizer.Text –

+0

是的,不知道如何在这里使用它。 t.Text? – irom

+3

我认为StartTagToken的数据将始终包含标签的名称(在本例中为“值”)。您应该再次推进标记器以获取TextToken。它的数据应该是文本本身(即“1,2,3”)。 – jussius

回答

3

这似乎为我工作:

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) 

我认为关键是寻找“价值”节点后揪着则firstChild。

1

您必须在接下来的Token上使用Text()方法。

if isAnchor := t.Data == "value"; isAnchor { 
    z.Next() 
    fmt.Println(z.Text()) 
} 
+0

z.Next()。Text undefined(type html.TokenType has no field or method Text) – irom

+1

已编辑。对不起,这个错误。 –

+0

现在:z.Next()。令牌未定义(类型html.TokenType没有字段或方法令牌) – irom

相关问题