Разобрать теги ввода HTML в Go - PullRequest
0 голосов
/ 31 мая 2018

Пакет синтаксического анализа HTML Go игнорирует входные теги и интерпретирует их как текстовое содержимое тега формы.Как лучше всего обойти это ограничение?

package main

import (
    "fmt"
    "strings"

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

const HTML = ` 
<!DOCTYPE html>
<html lang="en">
     <head>
        <meta charset="utf-8"/>
        <title>selected attribute</title>
    </head>
    <body>
        <form method="GET">
            <input type="submit" value="submit"/>
        </form>
    </body>
</html>
`

func main() {
    z := html.NewTokenizer(strings.NewReader(HTML))
    tt := html.TokenType(7)
    for tt != html.ErrorToken {
        tt = z.Next()
        if tt == html.StartTagToken {
            name, _ := z.TagName()
            fmt.Println(string(name))
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Для анализа input тегов следует использовать html.SelfClosingTagToken вместо html.StartTagToken.

0 голосов
/ 31 мая 2018

игнорирует входные теги и интерпретирует их как текстовое содержимое тега формы

Ваша предпосылка неверна, она не игнорирует входные теги, как показано ниже:

package main

import (
    "fmt"
    "golang.org/x/net/html"
    "strings"
)

const HTML = ` 
<!DOCTYPE html>
<html lang="en">
     <head>
        <meta charset="utf-8"/>
        <title>selected attribute</title>
    </head>
    <body>
        <form method="GET">
            <input type="submit" value="submit"/>
        </form>
    </body>
</html>
`

func main() {
    z, _ := html.Parse(strings.NewReader(HTML))
    var f func(*html.Node)
    f = func(n *html.Node) {
        if n.Type == html.ElementNode && n.Data == "input" {
            for _, a := range n.Attr {
                if a.Key == "value" {
                    fmt.Println(a.Val)
                    break
                }
            }
        }
        for c := n.FirstChild; c != nil; c = c.NextSibling {
            f(c)
        }
    }
    f(z)
}

Это выведет «submit», значение входного тега.

...