dongshan0202405 2017-03-26 15:07
浏览 29
已采纳

使用Go删除HTML下拉列表吗?

I'm using the package golang.org/x/net/html to scrape data out of HTML pages and this has been working fine so far. However, I don't know how to extract data from a drop-down list like this:

<!DOCTYPE html>
<html>
<body>

<select name="car" size="1" id="car">
  <option value="volvo">Volvo</option>
  <option value="saab">Saab</option>
  <option value="vw">VW</option>
  <option value="audi" selected>Audi</option>
</select>

<select name="animal" size="1" id="animal">
  <option value="dog">Dog</option>
  <option value="cat" selected>Cat</option>
  <option value="badger">Badger</option>
  <option value="mouse">Mouse</option>
</select>

I want to extract the pre-selected options, so the result becomes this:

car = audi
animal = cat

How can I accomplish this? In case golang.org/x/net/html is not capable of doing what I want, what else can I do to extract the data?

  • 写回答

2条回答 默认 最新

  • duanbanfei2875 2017-03-26 15:25
    关注

    You absolutely can do it with "net/html":

    package main
    
    import (
        "fmt"
        "golang.org/x/net/html"
        "strings"
    )
    
    func main() {
        s := "html"
    
        result := make(map[string]string)
        d := html.NewTokenizer(strings.NewReader(s))
        currID := ""
        for {
            tokenType := d.Next()
            if tokenType == html.ErrorToken {
                break
            }
    
            token := d.Token()
            switch tokenType {
            case html.StartTagToken:
                if token.Data == "select" {
                    for _, a := range token.Attr {
                        if a.Key == "id" {
                            currID = a.Val
                        }
                    }
                }
                if token.Data == "option" {
                    isSelected := false
                    for _, a := range token.Attr {
                        if a.Key == "selected" {
                            isSelected = true
                        }
                    }
                    if isSelected {
                        for _, a := range token.Attr {
                            if a.Key == "value" {
                                result[currID] = a.Val
                            }
                        }
                    }
                }
            }
        }
    
        fmt.Printf("%v
    ", result)
    }
    

    P.S. this code can be improved.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 抖音咸鱼付款链接转码支付宝
  • ¥15 ubuntu22.04上安装ursim-3.15.8.106339遇到的问题
  • ¥15 求螺旋焊缝的图像处理
  • ¥15 blast算法(相关搜索:数据库)
  • ¥15 请问有人会紧聚焦相关的matlab知识嘛?
  • ¥15 网络通信安全解决方案
  • ¥50 yalmip+Gurobi
  • ¥20 win10修改放大文本以及缩放与布局后蓝屏无法正常进入桌面
  • ¥15 itunes恢复数据最后一步发生错误
  • ¥15 关于#windows#的问题:2024年5月15日的win11更新后资源管理器没有地址栏了顶部的地址栏和文件搜索都消失了