【问题标题】:Go - Getting the text of a single particular HTML element from a document with a known structureGo - 从具有已知结构的文档中获取单个特定 HTML 元素的文本
【发布时间】:2014-04-27 22:15:16
【问题描述】:

在我正在编写的一个小脚本中,我向 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 解析器可能有点过分,这就是我朝这个方向发展的原因,尽管据我所知,那里有更好的东西。

感谢您的任何建议。

【问题讨论】:

    标签: html regex go


    【解决方案1】:

    看看这个包: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)
    }
    

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-20
        • 1970-01-01
        • 2014-10-26
        相关资源
        最近更新 更多