Go - 从具有已知结构的文档中获取单个特定HTML元素的文本

时间:2014-03-20 19:50:04

标签: html regex go

在我正在编写的一个小脚本中,我对一个Web服务进行POST并收到一个HTML文档作为响应。除了单个textarea的内容之外,本文档在很大程度上与我的需求无关。此textarea是页面中唯一的textarea,它具有我提前知道的特定name。我想获取该文本而不必担心文档中的任何其他内容。目前我正在使用正则表达式获取正确的行然后删除标签,但我觉得可能有更好的方法。

这是文档的样子:

<html><body>
<form name="query" action="http://www.example.net/action.php" method="post">
    <textarea type="text" name="nameiknow"/>The text I want</textarea>
    <div id="button">
        <input type="submit" value="Submit" />
    </div>
</form>
</body></html>

以下是我目前收到的文字:

s := string(body)

// Gets the line I want
r, _ := regexp.Compile("<textarea.*name=(\"|')nameiknow(\"|').*textarea>")
s = r.FindString(s)

// Deletes the tags
r, _ = regexp.Compile("<[^>]*>")
s = r.ReplaceAllString(s, "")

我认为在这种情况下使用完整的HTML解析器可能有点太多了,这就是为什么我朝着这个方向前进,尽管我知道有更好的东西。

我感谢您的任何建议。

2 个答案:

答案 0 :(得分:3)

看一下这个包:https://github.com/PuerkitoBio/goquery。它就像jQuery,但对于Go来说。它允许你做像

这样的事情
text := doc.Find("strong").Text()

完整的工作示例:

package main

import (
    "bytes"
    "fmt"

    "github.com/PuerkitoBio/goquery"
)

var s = `<html><body>
<form name="query" action="http://www.example.net/action.php" method="post">
    <textarea type="text" name="nameiknow">The text I want</textarea>
    <div id="button">
        <input type="submit" value="Submit" />
    </div>
</form>
</body></html>`

func main() {
    r := bytes.NewReader([]byte(s))
    doc, _ := goquery.NewDocumentFromReader(r)
    text := doc.Find("textarea").Text()
    fmt.Println(text)
}

打印:“我想要的文字”。

答案 1 :(得分:2)

虽然这不是使用正则表达式解析HTML的最佳做法。但正如你所愿,这是:

(<textarea\b[^>]*\bname\s*=\s*(?:\"|')\s*nameiknow\s*(?:\"|')[^<]*<\/textarea>)