2016-07-16 14 views
0

パターンの最後の出現後に特定のヘッダを抽出したいgolang文字列としてHTMLコードがあります。例を説明する:Golangのパターンが最後に出現した後のHTMLテンプレートの解析ヘッダ

func main() { 
    h := ` 
<html> 
<body> 
    <a name="0"> text </a> 
    <a name="1"> abc </a> 
    <a name="2"> def ghi jkl </a> 
    <a name="3"> abc </a> 
    <a name="4"> Some text </a> 
</body> 
</html>` 

    pattern := "abc" 

    // Now I want <a name="3"> to be printed. I mean, when someone 
    // searches for the pattern abc, the last occurence is the <a> 
    // section with the name "3". If the pattern is "def" then "2" 
    // should be printed, if the pattern is "text" then 4 should 
    // be printed 

} 

どのように私はこれを行うことができますか?私はテンプレートとスキャナーパッケージを使って遊んだが、動かすことができなかった。

答えて

0

これは、HTML入力が何であるかによって異なります。 You may be able to get away with using regexpがありますが、任意のhtmlで作業している場合は、https://godoc.org/golang.org/x/net/htmlなどの完全なhtmlパーサーを使用する必要があります。例えば

、(X /ネット/ HTMLを使用する)goqueryを使用して:

package main 

import (
     "fmt" 
     "strings" 

     "github.com/PuerkitoBio/goquery" 
) 

func main() { 
     h := ` 
<html> 
<body> 
    <a name="0"> text </a> 
    <a name="1"> abc </a> 
    <a name="2"> def ghi jkl </a> 
    <a name="3"> abc </a> 
    <a name="4"> Some text </a> 
</body> 
</html>` 

     pattern := "abc" 

     doc, err := goquery.NewDocumentFromReader(strings.NewReader(h)) 
     if err != nil { 
       panic(err) 
     } 

     doc.Find("a").Each(func(i int, s *goquery.Selection) { 
       if strings.TrimSpace(s.Text()) == pattern { 
         name, ok := s.Attr("name") 
         if ok { 
           fmt.Println(name) 
         } 
       } 
     }) 

} 

EDIT:またはその代わりに、あなたの実際の入力に応じて、contains selectorを使用することができるかもしれdoc.Find一部の:

// Don't do this if pattern is arbitrary user input 
name, ok := doc.Find(fmt.Sprintf("a:contains(%s)", pattern)).Last().Attr("name") 
if ok { 
     fmt.Println(name) 
} 
0

xquery XPathを使用すると、コードを簡略化できます。

package main 

import (
    "fmt" 
    "strings" 
    "github.com/antchfx/xquery/html" 
    "golang.org/x/net/html" 
) 

func main() { 
    htmlstr := `<html> 
    <body> 
    <a name="0"> text </a> 
    <a name="1"> abc </a> 
    <a name="2"> def ghi jkl </a> 
    <a name="3"> abc </a> 
    <a name="4"> Some text </a> 
    </body> 
    </html>` 
    root, err := html.Parse(strings.NewReader(htmlstr)) 
    if err != nil { 
     panic(err) 
    } 
    node := htmlquery.FindOne(root, "//a[normalize-space(text())='abc']") 
    fmt.Println(htmlquery.InnerText(node)) 
} 
関連する問題